{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "128fe476",
   "metadata": {},
   "source": [
    "# 基于backtrader实现高效的多因子策略（多股）\n",
    "\n",
    "\n",
    "## 数据介绍\n",
    "\n",
    "包含了一下五张表\n",
    "[('xjllb',), ('zcfzb',), ('lrb',), ('cwzbsj',), ('stock_daily',)]\n",
    "\n",
    "其中stock_daily包含了上证2千多只股票2018年1月——2023年2月的所有日线数据\n",
    "\n",
    "此数据是淘宝花了几十块钱买的，为了减少体积减少了年份与股票数\n",
    "\n",
    "其实也可以通过akshare爬取，如果需要更新数据建议自行爬取并写入数据库\n",
    "\n",
    "## sqlite3的基本操作\n",
    "\n",
    "* 数据库的连接 ：sqlite3.connect(r'F:\\量化金融\\stock_2018.db')\n",
    "\n",
    "* 数据库命令的执行：c.execute(\"select name from sqlite_master where type='table'\")\n",
    "\n",
    "* pandas下的数据库操作：读pd.read_sql；写z1.to_sql('stock_daily',conn,if_exists=\"append\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "578c125d",
   "metadata": {},
   "outputs": [],
   "source": [
    "import sqlite3\n",
    "import pandas as pd  \n",
    "import talib\n",
    "from datetime import datetime\n",
    "import backtrader as bt\n",
    "import matplotlib.pyplot as plt\n",
    "import akshare as ak\n",
    "import numpy as np\n",
    "%matplotlib inline   \n",
    "\n",
    "#正常显示画图时出现的中文和负号\n",
    "from pylab import mpl\n",
    "\n",
    "mpl.rcParams['font.sans-serif']=['SimHei']\n",
    "mpl.rcParams['axes.unicode_minus']=False"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "b8c19661",
   "metadata": {},
   "outputs": [],
   "source": [
    "conn=sqlite3.connect(r'F:\\量化金融\\stock_2018.db')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "fd8b2b20",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('xjllb',), ('zcfzb',), ('lrb',), ('cwzbsj',), ('stock_daily',)]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#获取数据库中的表\n",
    "c = conn.cursor()\n",
    "c.execute(\"select name from sqlite_master where type='table'\")\n",
    "tab_name=c.fetchall()\n",
    "tab_name"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "46ac71e0",
   "metadata": {},
   "outputs": [],
   "source": [
    "stock_daily0=pd.read_sql(\"select * from stock_daily where 股票代码='000004.SZ'\",con=conn)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "a3bdadec",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>index</th>\n",
       "      <th>交易日期</th>\n",
       "      <th>股票代码</th>\n",
       "      <th>股票简称</th>\n",
       "      <th>开盘价</th>\n",
       "      <th>最高价</th>\n",
       "      <th>最低价</th>\n",
       "      <th>收盘价</th>\n",
       "      <th>成交量(手)</th>\n",
       "      <th>成交额(千元)</th>\n",
       "      <th>...</th>\n",
       "      <th>市盈率(动态)</th>\n",
       "      <th>市净率</th>\n",
       "      <th>市销率</th>\n",
       "      <th>市销率(TTM)</th>\n",
       "      <th>股息率(%)</th>\n",
       "      <th>股息率(TTM)(%)</th>\n",
       "      <th>总股本(万股)</th>\n",
       "      <th>流通股本(万股)</th>\n",
       "      <th>总市值(万元)</th>\n",
       "      <th>流通市值(万元)</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>6206</td>\n",
       "      <td>20180102</td>\n",
       "      <td>000004.SZ</td>\n",
       "      <td>国农科技</td>\n",
       "      <td>90.5866</td>\n",
       "      <td>91.3994</td>\n",
       "      <td>89.4080</td>\n",
       "      <td>90.7898</td>\n",
       "      <td>6261.81</td>\n",
       "      <td>13951.004</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>16.2585</td>\n",
       "      <td>6.5215</td>\n",
       "      <td>13.2958</td>\n",
       "      <td>0.0</td>\n",
       "      <td>None</td>\n",
       "      <td>8397.6684</td>\n",
       "      <td>8296.3684</td>\n",
       "      <td>187603.9121</td>\n",
       "      <td>185340.8701</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>6207</td>\n",
       "      <td>20180103</td>\n",
       "      <td>000004.SZ</td>\n",
       "      <td>国农科技</td>\n",
       "      <td>91.1149</td>\n",
       "      <td>97.0890</td>\n",
       "      <td>90.5053</td>\n",
       "      <td>96.7232</td>\n",
       "      <td>18795.39</td>\n",
       "      <td>43218.416</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>17.3210</td>\n",
       "      <td>6.9477</td>\n",
       "      <td>14.1647</td>\n",
       "      <td>0.0</td>\n",
       "      <td>None</td>\n",
       "      <td>8397.6684</td>\n",
       "      <td>8296.3684</td>\n",
       "      <td>199864.5079</td>\n",
       "      <td>197453.5679</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>6208</td>\n",
       "      <td>20180104</td>\n",
       "      <td>000004.SZ</td>\n",
       "      <td>国农科技</td>\n",
       "      <td>96.7232</td>\n",
       "      <td>96.8451</td>\n",
       "      <td>93.9597</td>\n",
       "      <td>94.4474</td>\n",
       "      <td>14540.66</td>\n",
       "      <td>33908.548</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>16.9135</td>\n",
       "      <td>6.7842</td>\n",
       "      <td>13.8314</td>\n",
       "      <td>0.0</td>\n",
       "      <td>None</td>\n",
       "      <td>8397.6684</td>\n",
       "      <td>8296.3684</td>\n",
       "      <td>195161.8136</td>\n",
       "      <td>192807.6016</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>3 rows × 24 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   index      交易日期       股票代码  股票简称      开盘价      最高价      最低价      收盘价  \\\n",
       "0   6206  20180102  000004.SZ  国农科技  90.5866  91.3994  89.4080  90.7898   \n",
       "1   6207  20180103  000004.SZ  国农科技  91.1149  97.0890  90.5053  96.7232   \n",
       "2   6208  20180104  000004.SZ  国农科技  96.7232  96.8451  93.9597  94.4474   \n",
       "\n",
       "     成交量(手)    成交额(千元)  ...  市盈率(动态)      市净率     市销率  市销率(TTM)  股息率(%)  \\\n",
       "0   6261.81  13951.004  ...      0.0  16.2585  6.5215   13.2958     0.0   \n",
       "1  18795.39  43218.416  ...      0.0  17.3210  6.9477   14.1647     0.0   \n",
       "2  14540.66  33908.548  ...      0.0  16.9135  6.7842   13.8314     0.0   \n",
       "\n",
       "   股息率(TTM)(%)    总股本(万股)   流通股本(万股)      总市值(万元)     流通市值(万元)  \n",
       "0         None  8397.6684  8296.3684  187603.9121  185340.8701  \n",
       "1         None  8397.6684  8296.3684  199864.5079  197453.5679  \n",
       "2         None  8397.6684  8296.3684  195161.8136  192807.6016  \n",
       "\n",
       "[3 rows x 24 columns]"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "stock_daily0.head(3)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6bab79be",
   "metadata": {},
   "source": [
    "## 最简单的多股策略\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a3dba94e",
   "metadata": {},
   "source": [
    "### 完成数据的处理函数，输出符合backtrade要求的单股数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "4e5eee67",
   "metadata": {},
   "outputs": [],
   "source": [
    "stock_daily=pd.read_sql(\"select * from stock_daily where 股票代码>'003000.SZ'\",con=conn)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "86db9a5b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['index', '交易日期', '股票代码', '股票简称', '开盘价', '最高价', '最低价', '收盘价', '成交量(手)',\n",
       "       '成交额(千元)', '换手率(%)', '量比', '市盈率(静态)', '市盈率(TTM)', '市盈率(动态)', '市净率',\n",
       "       '市销率', '市销率(TTM)', '股息率(%)', '股息率(TTM)(%)', '总股本(万股)', '流通股本(万股)',\n",
       "       '总市值(万元)', '流通市值(万元)'],\n",
       "      dtype='object')"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "stock_daily.columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "d7341723",
   "metadata": {},
   "outputs": [],
   "source": [
    "stock_daily.columns=['index', 'date', '股票代码', '股票简称', 'open', 'high', 'low', 'close', 'volume',\n",
    "       '成交额(千元)', '换手率(%)', '量比', '市盈率(静态)', '市盈率(TTM)', '市盈率(动态)', '市净率',\n",
    "       '市销率', '市销率(TTM)', '股息率(%)', '股息率(TTM)(%)', '总股本(万股)', '流通股本(万股)',\n",
    "       '总市值(万元)', '流通市值(万元)']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "54ce604c",
   "metadata": {},
   "outputs": [],
   "source": [
    "stock_daily[\"date\"]=stock_daily[\"date\"].astype(\"str\").astype(\"datetime64\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "51c3f386",
   "metadata": {},
   "outputs": [],
   "source": [
    "stock_daily.set_index(\"date\",inplace=True,drop=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "62b03203",
   "metadata": {},
   "outputs": [],
   "source": [
    "stock_daily[\"openinterest\"]=0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "8e1b67dc",
   "metadata": {},
   "outputs": [],
   "source": [
    "syboml='003001.SZ'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "8f144b73",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>volume</th>\n",
       "      <th>openinterest</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2020-10-13</th>\n",
       "      <td>36.1900</td>\n",
       "      <td>43.4300</td>\n",
       "      <td>36.1900</td>\n",
       "      <td>43.4300</td>\n",
       "      <td>1755.12</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2020-10-14</th>\n",
       "      <td>47.7700</td>\n",
       "      <td>47.7700</td>\n",
       "      <td>44.0100</td>\n",
       "      <td>47.7700</td>\n",
       "      <td>109022.37</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2020-10-15</th>\n",
       "      <td>46.4400</td>\n",
       "      <td>46.8000</td>\n",
       "      <td>43.0400</td>\n",
       "      <td>43.0900</td>\n",
       "      <td>81268.36</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2020-10-16</th>\n",
       "      <td>41.0200</td>\n",
       "      <td>43.8900</td>\n",
       "      <td>40.1100</td>\n",
       "      <td>41.9400</td>\n",
       "      <td>57613.41</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2020-10-19</th>\n",
       "      <td>41.1300</td>\n",
       "      <td>41.8000</td>\n",
       "      <td>39.2500</td>\n",
       "      <td>39.4500</td>\n",
       "      <td>47553.71</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-02-13</th>\n",
       "      <td>21.5354</td>\n",
       "      <td>21.9188</td>\n",
       "      <td>21.3635</td>\n",
       "      <td>21.6279</td>\n",
       "      <td>16280.00</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-02-14</th>\n",
       "      <td>21.6808</td>\n",
       "      <td>21.8130</td>\n",
       "      <td>21.4561</td>\n",
       "      <td>21.5618</td>\n",
       "      <td>11786.54</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-02-15</th>\n",
       "      <td>21.6676</td>\n",
       "      <td>21.7337</td>\n",
       "      <td>21.4693</td>\n",
       "      <td>21.6411</td>\n",
       "      <td>11087.41</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-02-16</th>\n",
       "      <td>21.6940</td>\n",
       "      <td>22.2625</td>\n",
       "      <td>21.0198</td>\n",
       "      <td>21.2842</td>\n",
       "      <td>35873.95</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-02-17</th>\n",
       "      <td>21.4032</td>\n",
       "      <td>21.7866</td>\n",
       "      <td>21.2578</td>\n",
       "      <td>21.6147</td>\n",
       "      <td>28047.52</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>572 rows × 6 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "               open     high      low    close     volume  openinterest\n",
       "date                                                                   \n",
       "2020-10-13  36.1900  43.4300  36.1900  43.4300    1755.12             0\n",
       "2020-10-14  47.7700  47.7700  44.0100  47.7700  109022.37             0\n",
       "2020-10-15  46.4400  46.8000  43.0400  43.0900   81268.36             0\n",
       "2020-10-16  41.0200  43.8900  40.1100  41.9400   57613.41             0\n",
       "2020-10-19  41.1300  41.8000  39.2500  39.4500   47553.71             0\n",
       "...             ...      ...      ...      ...        ...           ...\n",
       "2023-02-13  21.5354  21.9188  21.3635  21.6279   16280.00             0\n",
       "2023-02-14  21.6808  21.8130  21.4561  21.5618   11786.54             0\n",
       "2023-02-15  21.6676  21.7337  21.4693  21.6411   11087.41             0\n",
       "2023-02-16  21.6940  22.2625  21.0198  21.2842   35873.95             0\n",
       "2023-02-17  21.4032  21.7866  21.2578  21.6147   28047.52             0\n",
       "\n",
       "[572 rows x 6 columns]"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "stock_daily[stock_daily[\"股票代码\"]==syboml][[\"open\",\"high\",\"low\",\"close\",\"volume\",\"openinterest\"]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "fc96bf18",
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_data_0(syboml):\n",
    "    return stock_daily[stock_daily[\"股票代码\"]==syboml][[\"open\",\"high\",\"low\",\"close\",\"volume\",\"openinterest\"]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "40102f4b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>volume</th>\n",
       "      <th>openinterest</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2020-09-22</th>\n",
       "      <td>9.8600</td>\n",
       "      <td>11.8400</td>\n",
       "      <td>9.8600</td>\n",
       "      <td>11.8400</td>\n",
       "      <td>2659.25</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2020-09-23</th>\n",
       "      <td>13.0200</td>\n",
       "      <td>13.0200</td>\n",
       "      <td>13.0200</td>\n",
       "      <td>13.0200</td>\n",
       "      <td>720.01</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2020-09-24</th>\n",
       "      <td>14.3200</td>\n",
       "      <td>14.3200</td>\n",
       "      <td>14.3200</td>\n",
       "      <td>14.3200</td>\n",
       "      <td>708.18</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2020-09-25</th>\n",
       "      <td>15.7500</td>\n",
       "      <td>15.7500</td>\n",
       "      <td>14.3200</td>\n",
       "      <td>15.0100</td>\n",
       "      <td>243874.54</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2020-09-28</th>\n",
       "      <td>14.0000</td>\n",
       "      <td>14.2900</td>\n",
       "      <td>13.5100</td>\n",
       "      <td>13.5100</td>\n",
       "      <td>154086.31</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-02-13</th>\n",
       "      <td>22.9680</td>\n",
       "      <td>23.5944</td>\n",
       "      <td>22.9158</td>\n",
       "      <td>23.3647</td>\n",
       "      <td>31574.99</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-02-14</th>\n",
       "      <td>23.3647</td>\n",
       "      <td>23.8241</td>\n",
       "      <td>23.0515</td>\n",
       "      <td>23.7928</td>\n",
       "      <td>28641.55</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-02-15</th>\n",
       "      <td>23.7614</td>\n",
       "      <td>24.1268</td>\n",
       "      <td>23.6153</td>\n",
       "      <td>23.8972</td>\n",
       "      <td>24071.00</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-02-16</th>\n",
       "      <td>23.6988</td>\n",
       "      <td>23.7823</td>\n",
       "      <td>22.6548</td>\n",
       "      <td>23.3856</td>\n",
       "      <td>43760.12</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-02-17</th>\n",
       "      <td>23.0202</td>\n",
       "      <td>23.0202</td>\n",
       "      <td>22.2476</td>\n",
       "      <td>22.5504</td>\n",
       "      <td>40138.75</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>581 rows × 6 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "               open     high      low    close     volume  openinterest\n",
       "date                                                                   \n",
       "2020-09-22   9.8600  11.8400   9.8600  11.8400    2659.25             0\n",
       "2020-09-23  13.0200  13.0200  13.0200  13.0200     720.01             0\n",
       "2020-09-24  14.3200  14.3200  14.3200  14.3200     708.18             0\n",
       "2020-09-25  15.7500  15.7500  14.3200  15.0100  243874.54             0\n",
       "2020-09-28  14.0000  14.2900  13.5100  13.5100  154086.31             0\n",
       "...             ...      ...      ...      ...        ...           ...\n",
       "2023-02-13  22.9680  23.5944  22.9158  23.3647   31574.99             0\n",
       "2023-02-14  23.3647  23.8241  23.0515  23.7928   28641.55             0\n",
       "2023-02-15  23.7614  24.1268  23.6153  23.8972   24071.00             0\n",
       "2023-02-16  23.6988  23.7823  22.6548  23.3856   43760.12             0\n",
       "2023-02-17  23.0202  23.0202  22.2476  22.5504   40138.75             0\n",
       "\n",
       "[581 rows x 6 columns]"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "get_data_0('003002.SZ')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "f185051a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1294"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(stock_daily[\"股票代码\"].unique())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "92860281",
   "metadata": {},
   "outputs": [],
   "source": [
    "#stock_daily.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "464ea4d1",
   "metadata": {},
   "source": [
    "### 通过循环让策略读入多个股票数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "f7fb638f",
   "metadata": {},
   "outputs": [],
   "source": [
    "#这是读入一个股票数据的策略，请改写为多个股票读入\n",
    "def huice_run(start,end,stock_list,strategy):\n",
    "\n",
    "    cerebro = bt.Cerebro()\n",
    "    for i in stock_list:\n",
    "        stock=get_data_0(i)\n",
    "        data = bt.feeds.PandasData(dataname=stock,fromdate=start,todate=end)           \n",
    "        cerebro.adddata(data,name=i) \n",
    "        \n",
    "    cerebro.addstrategy(strategy) \n",
    "    cerebro.broker.setcash(100000) \n",
    "    cerebro.broker.setcommission(commission=0.002) \n",
    "\n",
    "\n",
    "    print(start.date(),end.date())\n",
    "    print('初始资金: %.2f' % cerebro.broker.getvalue())\n",
    "    cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name = 'SharpeRatio')\n",
    "    cerebro.addanalyzer(bt.analyzers.DrawDown, _name='DW')\n",
    "    results = cerebro.run()\n",
    "    strat = results[0]\n",
    "    print('最终资金: %.2f' % cerebro.broker.getvalue())\n",
    "    print('夏普比率:', strat.analyzers.SharpeRatio.get_analysis())\n",
    "    print('回撤指标:', strat.analyzers.DW.get_analysis())\n",
    "    \n",
    "    return cerebro"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0a1574cd",
   "metadata": {},
   "source": [
    "## 多股策略的买入\n",
    "\n",
    "1，选择最开始的一只股票买入\n",
    "\n",
    "2，选择特定股票买入\n",
    "\n",
    "3，等比买入所有股票"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "d2a302bd",
   "metadata": {},
   "outputs": [],
   "source": [
    "#原始事件策略模板，请基于此改写\n",
    "class my_strategy_date(bt.Strategy):\n",
    "    #全局设定交易策略的参数\n",
    "\n",
    "    def __init__(self):\n",
    "        # 初始化交易指令、买卖价格和手续费\n",
    "        self.order = None\n",
    "\n",
    "    def next(self):\n",
    "        # 检查是否持仓 \n",
    "        #print(str(self.datetime.date(0)))\n",
    "        if str(self.datetime.date(0)) in sell_date.keys(): \n",
    "            s_list=sell_date[str(self.datetime.date(0))]\n",
    "            for i in s_list:\n",
    "                self.order_target_percent(target=0,data=i)\n",
    "                \n",
    "        if str(self.datetime.date(0)) in buy_date.keys(): \n",
    "            s_list=buy_date[str(self.datetime.date(0))]\n",
    "            for i in s_list:\n",
    "                self.order_target_percent(target=0.9/len(s_list),data=i)\n",
    "                \n",
    "\n",
    "            \n",
    "    def log(self, txt, dt=None):\n",
    "        ''' 输出日志'''\n",
    "        dt = dt or self.datas[0].datetime.date(0) # 拿现在的日期\n",
    "        print('%s, %s' % (dt.isoformat(), txt))\n",
    "\n",
    "    def notify_order(self, order):\n",
    "        if order.status in [order.Submitted, order.Accepted]:\n",
    "            # Buy/Sell order submitted/accepted to/by broker - Nothing to do\n",
    "            return\n",
    "\n",
    "        # Check if an order has been completed\n",
    "        # Attention: broker could reject order if not enough cash\n",
    "        if order.status in [order.Completed, order.Canceled, order.Margin]:\n",
    "            if order.isbuy():\n",
    "                self.log(f\"\"\"买入{order.data._name}, 成交量{order.executed.size}，成交价{order.executed.price:.2f}\"\"\")\n",
    "            elif order.issell():\n",
    "                self.log(f\"\"\"卖出{order.data._name}, 成交量{order.executed.size}，成交价{order.executed.price:.2f}\"\"\")\n",
    "            self.bar_executed = len(self)\n",
    "\n",
    "        # Write down: no pending order\n",
    "        self.order = None"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "74f3f335",
   "metadata": {},
   "outputs": [],
   "source": [
    "#get_data_0('003003.SZ').tail(20)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "94f12da9",
   "metadata": {},
   "outputs": [],
   "source": [
    "start=datetime(2020,9,22)\n",
    "end=datetime(2023,2,10)\n",
    "stock_list=[\"003002.SZ\",\"003003.SZ\"]\n",
    "buy_date={\"2020-09-22\":[\"003002.SZ\",\"003003.SZ\"]}\n",
    "sell_date={\"2023-02-02\":[\"003002.SZ\",\"003003.SZ\"]}\n",
    "#buy_date=[datetime(2020, 9, 22).date()]\n",
    "#sell_date=[]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "id": "4789ae06",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dict_keys(['2020-09-22'])"
      ]
     },
     "execution_count": 102,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "buy_date.keys()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "d43855b5",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2020-09-22 2023-02-10\n",
      "初始资金: 100000.00\n",
      "2020-09-23, 买入003002.SZ, 成交量3800，成交价13.02\n",
      "2020-09-23, 买入003003.SZ, 成交量2707，成交价18.28\n",
      "2023-02-03, 卖出003002.SZ, 成交量-3800，成交价20.89\n",
      "2023-02-03, 卖出003003.SZ, 成交量-2707，成交价12.09\n",
      "最终资金: 112731.75\n",
      "夏普比率: OrderedDict([('sharperatio', 0.1949083238190227)])\n",
      "回撤指标: AutoOrderedDict([('len', 58), ('drawdown', 8.111117263713433), ('moneydown', 9950.936514), ('max', AutoOrderedDict([('len', 455), ('drawdown', 47.599755296618), ('moneydown', 56371.585799999986)]))])\n"
     ]
    }
   ],
   "source": [
    "result=huice_run(start,end,stock_list,my_strategy_date)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "45c71cd9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "/* Put everything inside the global mpl namespace */\n",
       "/* global mpl */\n",
       "window.mpl = {};\n",
       "\n",
       "mpl.get_websocket_type = function () {\n",
       "    if (typeof WebSocket !== 'undefined') {\n",
       "        return WebSocket;\n",
       "    } else if (typeof MozWebSocket !== 'undefined') {\n",
       "        return MozWebSocket;\n",
       "    } else {\n",
       "        alert(\n",
       "            'Your browser does not have WebSocket support. ' +\n",
       "                'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
       "                'Firefox 4 and 5 are also supported but you ' +\n",
       "                'have to enable WebSockets in about:config.'\n",
       "        );\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
       "    this.id = figure_id;\n",
       "\n",
       "    this.ws = websocket;\n",
       "\n",
       "    this.supports_binary = this.ws.binaryType !== undefined;\n",
       "\n",
       "    if (!this.supports_binary) {\n",
       "        var warnings = document.getElementById('mpl-warnings');\n",
       "        if (warnings) {\n",
       "            warnings.style.display = 'block';\n",
       "            warnings.textContent =\n",
       "                'This browser does not support binary websocket messages. ' +\n",
       "                'Performance may be slow.';\n",
       "        }\n",
       "    }\n",
       "\n",
       "    this.imageObj = new Image();\n",
       "\n",
       "    this.context = undefined;\n",
       "    this.message = undefined;\n",
       "    this.canvas = undefined;\n",
       "    this.rubberband_canvas = undefined;\n",
       "    this.rubberband_context = undefined;\n",
       "    this.format_dropdown = undefined;\n",
       "\n",
       "    this.image_mode = 'full';\n",
       "\n",
       "    this.root = document.createElement('div');\n",
       "    this.root.setAttribute('style', 'display: inline-block');\n",
       "    this._root_extra_style(this.root);\n",
       "\n",
       "    parent_element.appendChild(this.root);\n",
       "\n",
       "    this._init_header(this);\n",
       "    this._init_canvas(this);\n",
       "    this._init_toolbar(this);\n",
       "\n",
       "    var fig = this;\n",
       "\n",
       "    this.waiting = false;\n",
       "\n",
       "    this.ws.onopen = function () {\n",
       "        fig.send_message('supports_binary', { value: fig.supports_binary });\n",
       "        fig.send_message('send_image_mode', {});\n",
       "        if (fig.ratio !== 1) {\n",
       "            fig.send_message('set_device_pixel_ratio', {\n",
       "                device_pixel_ratio: fig.ratio,\n",
       "            });\n",
       "        }\n",
       "        fig.send_message('refresh', {});\n",
       "    };\n",
       "\n",
       "    this.imageObj.onload = function () {\n",
       "        if (fig.image_mode === 'full') {\n",
       "            // Full images could contain transparency (where diff images\n",
       "            // almost always do), so we need to clear the canvas so that\n",
       "            // there is no ghosting.\n",
       "            fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
       "        }\n",
       "        fig.context.drawImage(fig.imageObj, 0, 0);\n",
       "    };\n",
       "\n",
       "    this.imageObj.onunload = function () {\n",
       "        fig.ws.close();\n",
       "    };\n",
       "\n",
       "    this.ws.onmessage = this._make_on_message_function(this);\n",
       "\n",
       "    this.ondownload = ondownload;\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._init_header = function () {\n",
       "    var titlebar = document.createElement('div');\n",
       "    titlebar.classList =\n",
       "        'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
       "    var titletext = document.createElement('div');\n",
       "    titletext.classList = 'ui-dialog-title';\n",
       "    titletext.setAttribute(\n",
       "        'style',\n",
       "        'width: 100%; text-align: center; padding: 3px;'\n",
       "    );\n",
       "    titlebar.appendChild(titletext);\n",
       "    this.root.appendChild(titlebar);\n",
       "    this.header = titletext;\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
       "\n",
       "mpl.figure.prototype._init_canvas = function () {\n",
       "    var fig = this;\n",
       "\n",
       "    var canvas_div = (this.canvas_div = document.createElement('div'));\n",
       "    canvas_div.setAttribute(\n",
       "        'style',\n",
       "        'border: 1px solid #ddd;' +\n",
       "            'box-sizing: content-box;' +\n",
       "            'clear: both;' +\n",
       "            'min-height: 1px;' +\n",
       "            'min-width: 1px;' +\n",
       "            'outline: 0;' +\n",
       "            'overflow: hidden;' +\n",
       "            'position: relative;' +\n",
       "            'resize: both;'\n",
       "    );\n",
       "\n",
       "    function on_keyboard_event_closure(name) {\n",
       "        return function (event) {\n",
       "            return fig.key_event(event, name);\n",
       "        };\n",
       "    }\n",
       "\n",
       "    canvas_div.addEventListener(\n",
       "        'keydown',\n",
       "        on_keyboard_event_closure('key_press')\n",
       "    );\n",
       "    canvas_div.addEventListener(\n",
       "        'keyup',\n",
       "        on_keyboard_event_closure('key_release')\n",
       "    );\n",
       "\n",
       "    this._canvas_extra_style(canvas_div);\n",
       "    this.root.appendChild(canvas_div);\n",
       "\n",
       "    var canvas = (this.canvas = document.createElement('canvas'));\n",
       "    canvas.classList.add('mpl-canvas');\n",
       "    canvas.setAttribute('style', 'box-sizing: content-box;');\n",
       "\n",
       "    this.context = canvas.getContext('2d');\n",
       "\n",
       "    var backingStore =\n",
       "        this.context.backingStorePixelRatio ||\n",
       "        this.context.webkitBackingStorePixelRatio ||\n",
       "        this.context.mozBackingStorePixelRatio ||\n",
       "        this.context.msBackingStorePixelRatio ||\n",
       "        this.context.oBackingStorePixelRatio ||\n",
       "        this.context.backingStorePixelRatio ||\n",
       "        1;\n",
       "\n",
       "    this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
       "\n",
       "    var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
       "        'canvas'\n",
       "    ));\n",
       "    rubberband_canvas.setAttribute(\n",
       "        'style',\n",
       "        'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n",
       "    );\n",
       "\n",
       "    // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
       "    if (this.ResizeObserver === undefined) {\n",
       "        if (window.ResizeObserver !== undefined) {\n",
       "            this.ResizeObserver = window.ResizeObserver;\n",
       "        } else {\n",
       "            var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
       "            this.ResizeObserver = obs.ResizeObserver;\n",
       "        }\n",
       "    }\n",
       "\n",
       "    this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
       "        var nentries = entries.length;\n",
       "        for (var i = 0; i < nentries; i++) {\n",
       "            var entry = entries[i];\n",
       "            var width, height;\n",
       "            if (entry.contentBoxSize) {\n",
       "                if (entry.contentBoxSize instanceof Array) {\n",
       "                    // Chrome 84 implements new version of spec.\n",
       "                    width = entry.contentBoxSize[0].inlineSize;\n",
       "                    height = entry.contentBoxSize[0].blockSize;\n",
       "                } else {\n",
       "                    // Firefox implements old version of spec.\n",
       "                    width = entry.contentBoxSize.inlineSize;\n",
       "                    height = entry.contentBoxSize.blockSize;\n",
       "                }\n",
       "            } else {\n",
       "                // Chrome <84 implements even older version of spec.\n",
       "                width = entry.contentRect.width;\n",
       "                height = entry.contentRect.height;\n",
       "            }\n",
       "\n",
       "            // Keep the size of the canvas and rubber band canvas in sync with\n",
       "            // the canvas container.\n",
       "            if (entry.devicePixelContentBoxSize) {\n",
       "                // Chrome 84 implements new version of spec.\n",
       "                canvas.setAttribute(\n",
       "                    'width',\n",
       "                    entry.devicePixelContentBoxSize[0].inlineSize\n",
       "                );\n",
       "                canvas.setAttribute(\n",
       "                    'height',\n",
       "                    entry.devicePixelContentBoxSize[0].blockSize\n",
       "                );\n",
       "            } else {\n",
       "                canvas.setAttribute('width', width * fig.ratio);\n",
       "                canvas.setAttribute('height', height * fig.ratio);\n",
       "            }\n",
       "            canvas.setAttribute(\n",
       "                'style',\n",
       "                'width: ' + width + 'px; height: ' + height + 'px;'\n",
       "            );\n",
       "\n",
       "            rubberband_canvas.setAttribute('width', width);\n",
       "            rubberband_canvas.setAttribute('height', height);\n",
       "\n",
       "            // And update the size in Python. We ignore the initial 0/0 size\n",
       "            // that occurs as the element is placed into the DOM, which should\n",
       "            // otherwise not happen due to the minimum size styling.\n",
       "            if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
       "                fig.request_resize(width, height);\n",
       "            }\n",
       "        }\n",
       "    });\n",
       "    this.resizeObserverInstance.observe(canvas_div);\n",
       "\n",
       "    function on_mouse_event_closure(name) {\n",
       "        return function (event) {\n",
       "            return fig.mouse_event(event, name);\n",
       "        };\n",
       "    }\n",
       "\n",
       "    rubberband_canvas.addEventListener(\n",
       "        'mousedown',\n",
       "        on_mouse_event_closure('button_press')\n",
       "    );\n",
       "    rubberband_canvas.addEventListener(\n",
       "        'mouseup',\n",
       "        on_mouse_event_closure('button_release')\n",
       "    );\n",
       "    rubberband_canvas.addEventListener(\n",
       "        'dblclick',\n",
       "        on_mouse_event_closure('dblclick')\n",
       "    );\n",
       "    // Throttle sequential mouse events to 1 every 20ms.\n",
       "    rubberband_canvas.addEventListener(\n",
       "        'mousemove',\n",
       "        on_mouse_event_closure('motion_notify')\n",
       "    );\n",
       "\n",
       "    rubberband_canvas.addEventListener(\n",
       "        'mouseenter',\n",
       "        on_mouse_event_closure('figure_enter')\n",
       "    );\n",
       "    rubberband_canvas.addEventListener(\n",
       "        'mouseleave',\n",
       "        on_mouse_event_closure('figure_leave')\n",
       "    );\n",
       "\n",
       "    canvas_div.addEventListener('wheel', function (event) {\n",
       "        if (event.deltaY < 0) {\n",
       "            event.step = 1;\n",
       "        } else {\n",
       "            event.step = -1;\n",
       "        }\n",
       "        on_mouse_event_closure('scroll')(event);\n",
       "    });\n",
       "\n",
       "    canvas_div.appendChild(canvas);\n",
       "    canvas_div.appendChild(rubberband_canvas);\n",
       "\n",
       "    this.rubberband_context = rubberband_canvas.getContext('2d');\n",
       "    this.rubberband_context.strokeStyle = '#000000';\n",
       "\n",
       "    this._resize_canvas = function (width, height, forward) {\n",
       "        if (forward) {\n",
       "            canvas_div.style.width = width + 'px';\n",
       "            canvas_div.style.height = height + 'px';\n",
       "        }\n",
       "    };\n",
       "\n",
       "    // Disable right mouse context menu.\n",
       "    this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n",
       "        event.preventDefault();\n",
       "        return false;\n",
       "    });\n",
       "\n",
       "    function set_focus() {\n",
       "        canvas.focus();\n",
       "        canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    window.setTimeout(set_focus, 100);\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function () {\n",
       "    var fig = this;\n",
       "\n",
       "    var toolbar = document.createElement('div');\n",
       "    toolbar.classList = 'mpl-toolbar';\n",
       "    this.root.appendChild(toolbar);\n",
       "\n",
       "    function on_click_closure(name) {\n",
       "        return function (_event) {\n",
       "            return fig.toolbar_button_onclick(name);\n",
       "        };\n",
       "    }\n",
       "\n",
       "    function on_mouseover_closure(tooltip) {\n",
       "        return function (event) {\n",
       "            if (!event.currentTarget.disabled) {\n",
       "                return fig.toolbar_button_onmouseover(tooltip);\n",
       "            }\n",
       "        };\n",
       "    }\n",
       "\n",
       "    fig.buttons = {};\n",
       "    var buttonGroup = document.createElement('div');\n",
       "    buttonGroup.classList = 'mpl-button-group';\n",
       "    for (var toolbar_ind in mpl.toolbar_items) {\n",
       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
       "\n",
       "        if (!name) {\n",
       "            /* Instead of a spacer, we start a new button group. */\n",
       "            if (buttonGroup.hasChildNodes()) {\n",
       "                toolbar.appendChild(buttonGroup);\n",
       "            }\n",
       "            buttonGroup = document.createElement('div');\n",
       "            buttonGroup.classList = 'mpl-button-group';\n",
       "            continue;\n",
       "        }\n",
       "\n",
       "        var button = (fig.buttons[name] = document.createElement('button'));\n",
       "        button.classList = 'mpl-widget';\n",
       "        button.setAttribute('role', 'button');\n",
       "        button.setAttribute('aria-disabled', 'false');\n",
       "        button.addEventListener('click', on_click_closure(method_name));\n",
       "        button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
       "\n",
       "        var icon_img = document.createElement('img');\n",
       "        icon_img.src = '_images/' + image + '.png';\n",
       "        icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
       "        icon_img.alt = tooltip;\n",
       "        button.appendChild(icon_img);\n",
       "\n",
       "        buttonGroup.appendChild(button);\n",
       "    }\n",
       "\n",
       "    if (buttonGroup.hasChildNodes()) {\n",
       "        toolbar.appendChild(buttonGroup);\n",
       "    }\n",
       "\n",
       "    var fmt_picker = document.createElement('select');\n",
       "    fmt_picker.classList = 'mpl-widget';\n",
       "    toolbar.appendChild(fmt_picker);\n",
       "    this.format_dropdown = fmt_picker;\n",
       "\n",
       "    for (var ind in mpl.extensions) {\n",
       "        var fmt = mpl.extensions[ind];\n",
       "        var option = document.createElement('option');\n",
       "        option.selected = fmt === mpl.default_extension;\n",
       "        option.innerHTML = fmt;\n",
       "        fmt_picker.appendChild(option);\n",
       "    }\n",
       "\n",
       "    var status_bar = document.createElement('span');\n",
       "    status_bar.classList = 'mpl-message';\n",
       "    toolbar.appendChild(status_bar);\n",
       "    this.message = status_bar;\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
       "    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
       "    // which will in turn request a refresh of the image.\n",
       "    this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.send_message = function (type, properties) {\n",
       "    properties['type'] = type;\n",
       "    properties['figure_id'] = this.id;\n",
       "    this.ws.send(JSON.stringify(properties));\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.send_draw_message = function () {\n",
       "    if (!this.waiting) {\n",
       "        this.waiting = true;\n",
       "        this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
       "    var format_dropdown = fig.format_dropdown;\n",
       "    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
       "    fig.ondownload(fig, format);\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
       "    var size = msg['size'];\n",
       "    if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
       "        fig._resize_canvas(size[0], size[1], msg['forward']);\n",
       "        fig.send_message('refresh', {});\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
       "    var x0 = msg['x0'] / fig.ratio;\n",
       "    var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
       "    var x1 = msg['x1'] / fig.ratio;\n",
       "    var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
       "    x0 = Math.floor(x0) + 0.5;\n",
       "    y0 = Math.floor(y0) + 0.5;\n",
       "    x1 = Math.floor(x1) + 0.5;\n",
       "    y1 = Math.floor(y1) + 0.5;\n",
       "    var min_x = Math.min(x0, x1);\n",
       "    var min_y = Math.min(y0, y1);\n",
       "    var width = Math.abs(x1 - x0);\n",
       "    var height = Math.abs(y1 - y0);\n",
       "\n",
       "    fig.rubberband_context.clearRect(\n",
       "        0,\n",
       "        0,\n",
       "        fig.canvas.width / fig.ratio,\n",
       "        fig.canvas.height / fig.ratio\n",
       "    );\n",
       "\n",
       "    fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
       "    // Updates the figure title.\n",
       "    fig.header.textContent = msg['label'];\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
       "    fig.rubberband_canvas.style.cursor = msg['cursor'];\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_message = function (fig, msg) {\n",
       "    fig.message.textContent = msg['message'];\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
       "    // Request the server to send over a new figure.\n",
       "    fig.send_draw_message();\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
       "    fig.image_mode = msg['mode'];\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
       "    for (var key in msg) {\n",
       "        if (!(key in fig.buttons)) {\n",
       "            continue;\n",
       "        }\n",
       "        fig.buttons[key].disabled = !msg[key];\n",
       "        fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
       "    if (msg['mode'] === 'PAN') {\n",
       "        fig.buttons['Pan'].classList.add('active');\n",
       "        fig.buttons['Zoom'].classList.remove('active');\n",
       "    } else if (msg['mode'] === 'ZOOM') {\n",
       "        fig.buttons['Pan'].classList.remove('active');\n",
       "        fig.buttons['Zoom'].classList.add('active');\n",
       "    } else {\n",
       "        fig.buttons['Pan'].classList.remove('active');\n",
       "        fig.buttons['Zoom'].classList.remove('active');\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.updated_canvas_event = function () {\n",
       "    // Called whenever the canvas gets updated.\n",
       "    this.send_message('ack', {});\n",
       "};\n",
       "\n",
       "// A function to construct a web socket function for onmessage handling.\n",
       "// Called in the figure constructor.\n",
       "mpl.figure.prototype._make_on_message_function = function (fig) {\n",
       "    return function socket_on_message(evt) {\n",
       "        if (evt.data instanceof Blob) {\n",
       "            var img = evt.data;\n",
       "            if (img.type !== 'image/png') {\n",
       "                /* FIXME: We get \"Resource interpreted as Image but\n",
       "                 * transferred with MIME type text/plain:\" errors on\n",
       "                 * Chrome.  But how to set the MIME type?  It doesn't seem\n",
       "                 * to be part of the websocket stream */\n",
       "                img.type = 'image/png';\n",
       "            }\n",
       "\n",
       "            /* Free the memory for the previous frames */\n",
       "            if (fig.imageObj.src) {\n",
       "                (window.URL || window.webkitURL).revokeObjectURL(\n",
       "                    fig.imageObj.src\n",
       "                );\n",
       "            }\n",
       "\n",
       "            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
       "                img\n",
       "            );\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        } else if (\n",
       "            typeof evt.data === 'string' &&\n",
       "            evt.data.slice(0, 21) === 'data:image/png;base64'\n",
       "        ) {\n",
       "            fig.imageObj.src = evt.data;\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        }\n",
       "\n",
       "        var msg = JSON.parse(evt.data);\n",
       "        var msg_type = msg['type'];\n",
       "\n",
       "        // Call the  \"handle_{type}\" callback, which takes\n",
       "        // the figure and JSON message as its only arguments.\n",
       "        try {\n",
       "            var callback = fig['handle_' + msg_type];\n",
       "        } catch (e) {\n",
       "            console.log(\n",
       "                \"No handler for the '\" + msg_type + \"' message type: \",\n",
       "                msg\n",
       "            );\n",
       "            return;\n",
       "        }\n",
       "\n",
       "        if (callback) {\n",
       "            try {\n",
       "                // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
       "                callback(fig, msg);\n",
       "            } catch (e) {\n",
       "                console.log(\n",
       "                    \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
       "                    e,\n",
       "                    e.stack,\n",
       "                    msg\n",
       "                );\n",
       "            }\n",
       "        }\n",
       "    };\n",
       "};\n",
       "\n",
       "// from https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
       "mpl.findpos = function (e) {\n",
       "    //this section is from http://www.quirksmode.org/js/events_properties.html\n",
       "    var targ;\n",
       "    if (!e) {\n",
       "        e = window.event;\n",
       "    }\n",
       "    if (e.target) {\n",
       "        targ = e.target;\n",
       "    } else if (e.srcElement) {\n",
       "        targ = e.srcElement;\n",
       "    }\n",
       "    if (targ.nodeType === 3) {\n",
       "        // defeat Safari bug\n",
       "        targ = targ.parentNode;\n",
       "    }\n",
       "\n",
       "    // pageX,Y are the mouse positions relative to the document\n",
       "    var boundingRect = targ.getBoundingClientRect();\n",
       "    var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n",
       "    var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n",
       "\n",
       "    return { x: x, y: y };\n",
       "};\n",
       "\n",
       "/*\n",
       " * return a copy of an object with only non-object keys\n",
       " * we need this to avoid circular references\n",
       " * https://stackoverflow.com/a/24161582/3208463\n",
       " */\n",
       "function simpleKeys(original) {\n",
       "    return Object.keys(original).reduce(function (obj, key) {\n",
       "        if (typeof original[key] !== 'object') {\n",
       "            obj[key] = original[key];\n",
       "        }\n",
       "        return obj;\n",
       "    }, {});\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.mouse_event = function (event, name) {\n",
       "    var canvas_pos = mpl.findpos(event);\n",
       "\n",
       "    if (name === 'button_press') {\n",
       "        this.canvas.focus();\n",
       "        this.canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    var x = canvas_pos.x * this.ratio;\n",
       "    var y = canvas_pos.y * this.ratio;\n",
       "\n",
       "    this.send_message(name, {\n",
       "        x: x,\n",
       "        y: y,\n",
       "        button: event.button,\n",
       "        step: event.step,\n",
       "        guiEvent: simpleKeys(event),\n",
       "    });\n",
       "\n",
       "    /* This prevents the web browser from automatically changing to\n",
       "     * the text insertion cursor when the button is pressed.  We want\n",
       "     * to control all of the cursor setting manually through the\n",
       "     * 'cursor' event from matplotlib */\n",
       "    event.preventDefault();\n",
       "    return false;\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
       "    // Handle any extra behaviour associated with a key event\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.key_event = function (event, name) {\n",
       "    // Prevent repeat events\n",
       "    if (name === 'key_press') {\n",
       "        if (event.key === this._key) {\n",
       "            return;\n",
       "        } else {\n",
       "            this._key = event.key;\n",
       "        }\n",
       "    }\n",
       "    if (name === 'key_release') {\n",
       "        this._key = null;\n",
       "    }\n",
       "\n",
       "    var value = '';\n",
       "    if (event.ctrlKey && event.key !== 'Control') {\n",
       "        value += 'ctrl+';\n",
       "    }\n",
       "    else if (event.altKey && event.key !== 'Alt') {\n",
       "        value += 'alt+';\n",
       "    }\n",
       "    else if (event.shiftKey && event.key !== 'Shift') {\n",
       "        value += 'shift+';\n",
       "    }\n",
       "\n",
       "    value += 'k' + event.key;\n",
       "\n",
       "    this._key_event_extra(event, name);\n",
       "\n",
       "    this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
       "    return false;\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
       "    if (name === 'download') {\n",
       "        this.handle_save(this, null);\n",
       "    } else {\n",
       "        this.send_message('toolbar_button', { name: name });\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
       "    this.message.textContent = tooltip;\n",
       "};\n",
       "\n",
       "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
       "// prettier-ignore\n",
       "var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\n",
       "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
       "\n",
       "mpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
       "\n",
       "mpl.default_extension = \"png\";/* global mpl */\n",
       "\n",
       "var comm_websocket_adapter = function (comm) {\n",
       "    // Create a \"websocket\"-like object which calls the given IPython comm\n",
       "    // object with the appropriate methods. Currently this is a non binary\n",
       "    // socket, so there is still some room for performance tuning.\n",
       "    var ws = {};\n",
       "\n",
       "    ws.binaryType = comm.kernel.ws.binaryType;\n",
       "    ws.readyState = comm.kernel.ws.readyState;\n",
       "    function updateReadyState(_event) {\n",
       "        if (comm.kernel.ws) {\n",
       "            ws.readyState = comm.kernel.ws.readyState;\n",
       "        } else {\n",
       "            ws.readyState = 3; // Closed state.\n",
       "        }\n",
       "    }\n",
       "    comm.kernel.ws.addEventListener('open', updateReadyState);\n",
       "    comm.kernel.ws.addEventListener('close', updateReadyState);\n",
       "    comm.kernel.ws.addEventListener('error', updateReadyState);\n",
       "\n",
       "    ws.close = function () {\n",
       "        comm.close();\n",
       "    };\n",
       "    ws.send = function (m) {\n",
       "        //console.log('sending', m);\n",
       "        comm.send(m);\n",
       "    };\n",
       "    // Register the callback with on_msg.\n",
       "    comm.on_msg(function (msg) {\n",
       "        //console.log('receiving', msg['content']['data'], msg);\n",
       "        var data = msg['content']['data'];\n",
       "        if (data['blob'] !== undefined) {\n",
       "            data = {\n",
       "                data: new Blob(msg['buffers'], { type: data['blob'] }),\n",
       "            };\n",
       "        }\n",
       "        // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
       "        ws.onmessage(data);\n",
       "    });\n",
       "    return ws;\n",
       "};\n",
       "\n",
       "mpl.mpl_figure_comm = function (comm, msg) {\n",
       "    // This is the function which gets called when the mpl process\n",
       "    // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
       "\n",
       "    var id = msg.content.data.id;\n",
       "    // Get hold of the div created by the display call when the Comm\n",
       "    // socket was opened in Python.\n",
       "    var element = document.getElementById(id);\n",
       "    var ws_proxy = comm_websocket_adapter(comm);\n",
       "\n",
       "    function ondownload(figure, _format) {\n",
       "        window.open(figure.canvas.toDataURL());\n",
       "    }\n",
       "\n",
       "    var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
       "\n",
       "    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
       "    // web socket which is closed, not our websocket->open comm proxy.\n",
       "    ws_proxy.onopen();\n",
       "\n",
       "    fig.parent_element = element;\n",
       "    fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
       "    if (!fig.cell_info) {\n",
       "        console.error('Failed to find cell for figure', id, fig);\n",
       "        return;\n",
       "    }\n",
       "    fig.cell_info[0].output_area.element.on(\n",
       "        'cleared',\n",
       "        { fig: fig },\n",
       "        fig._remove_fig_handler\n",
       "    );\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_close = function (fig, msg) {\n",
       "    var width = fig.canvas.width / fig.ratio;\n",
       "    fig.cell_info[0].output_area.element.off(\n",
       "        'cleared',\n",
       "        fig._remove_fig_handler\n",
       "    );\n",
       "    fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
       "\n",
       "    // Update the output cell to use the data from the current canvas.\n",
       "    fig.push_to_output();\n",
       "    var dataURL = fig.canvas.toDataURL();\n",
       "    // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
       "    // the notebook keyboard shortcuts fail.\n",
       "    IPython.keyboard_manager.enable();\n",
       "    fig.parent_element.innerHTML =\n",
       "        '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
       "    fig.close_ws(fig, msg);\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.close_ws = function (fig, msg) {\n",
       "    fig.send_message('closing', msg);\n",
       "    // fig.ws.close()\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
       "    // Turn the data on the canvas into data in the output cell.\n",
       "    var width = this.canvas.width / this.ratio;\n",
       "    var dataURL = this.canvas.toDataURL();\n",
       "    this.cell_info[1]['text/html'] =\n",
       "        '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.updated_canvas_event = function () {\n",
       "    // Tell IPython that the notebook contents must change.\n",
       "    IPython.notebook.set_dirty(true);\n",
       "    this.send_message('ack', {});\n",
       "    var fig = this;\n",
       "    // Wait a second, then push the new image to the DOM so\n",
       "    // that it is saved nicely (might be nice to debounce this).\n",
       "    setTimeout(function () {\n",
       "        fig.push_to_output();\n",
       "    }, 1000);\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function () {\n",
       "    var fig = this;\n",
       "\n",
       "    var toolbar = document.createElement('div');\n",
       "    toolbar.classList = 'btn-toolbar';\n",
       "    this.root.appendChild(toolbar);\n",
       "\n",
       "    function on_click_closure(name) {\n",
       "        return function (_event) {\n",
       "            return fig.toolbar_button_onclick(name);\n",
       "        };\n",
       "    }\n",
       "\n",
       "    function on_mouseover_closure(tooltip) {\n",
       "        return function (event) {\n",
       "            if (!event.currentTarget.disabled) {\n",
       "                return fig.toolbar_button_onmouseover(tooltip);\n",
       "            }\n",
       "        };\n",
       "    }\n",
       "\n",
       "    fig.buttons = {};\n",
       "    var buttonGroup = document.createElement('div');\n",
       "    buttonGroup.classList = 'btn-group';\n",
       "    var button;\n",
       "    for (var toolbar_ind in mpl.toolbar_items) {\n",
       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
       "\n",
       "        if (!name) {\n",
       "            /* Instead of a spacer, we start a new button group. */\n",
       "            if (buttonGroup.hasChildNodes()) {\n",
       "                toolbar.appendChild(buttonGroup);\n",
       "            }\n",
       "            buttonGroup = document.createElement('div');\n",
       "            buttonGroup.classList = 'btn-group';\n",
       "            continue;\n",
       "        }\n",
       "\n",
       "        button = fig.buttons[name] = document.createElement('button');\n",
       "        button.classList = 'btn btn-default';\n",
       "        button.href = '#';\n",
       "        button.title = name;\n",
       "        button.innerHTML = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n",
       "        button.addEventListener('click', on_click_closure(method_name));\n",
       "        button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
       "        buttonGroup.appendChild(button);\n",
       "    }\n",
       "\n",
       "    if (buttonGroup.hasChildNodes()) {\n",
       "        toolbar.appendChild(buttonGroup);\n",
       "    }\n",
       "\n",
       "    // Add the status bar.\n",
       "    var status_bar = document.createElement('span');\n",
       "    status_bar.classList = 'mpl-message pull-right';\n",
       "    toolbar.appendChild(status_bar);\n",
       "    this.message = status_bar;\n",
       "\n",
       "    // Add the close button to the window.\n",
       "    var buttongrp = document.createElement('div');\n",
       "    buttongrp.classList = 'btn-group inline pull-right';\n",
       "    button = document.createElement('button');\n",
       "    button.classList = 'btn btn-mini btn-primary';\n",
       "    button.href = '#';\n",
       "    button.title = 'Stop Interaction';\n",
       "    button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n",
       "    button.addEventListener('click', function (_evt) {\n",
       "        fig.handle_close(fig, {});\n",
       "    });\n",
       "    button.addEventListener(\n",
       "        'mouseover',\n",
       "        on_mouseover_closure('Stop Interaction')\n",
       "    );\n",
       "    buttongrp.appendChild(button);\n",
       "    var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
       "    titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._remove_fig_handler = function (event) {\n",
       "    var fig = event.data.fig;\n",
       "    if (event.target !== this) {\n",
       "        // Ignore bubbled events from children.\n",
       "        return;\n",
       "    }\n",
       "    fig.close_ws(fig, {});\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function (el) {\n",
       "    el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function (el) {\n",
       "    // this is important to make the div 'focusable\n",
       "    el.setAttribute('tabindex', 0);\n",
       "    // reach out to IPython and tell the keyboard manager to turn it's self\n",
       "    // off when our div gets focus\n",
       "\n",
       "    // location in version 3\n",
       "    if (IPython.notebook.keyboard_manager) {\n",
       "        IPython.notebook.keyboard_manager.register_events(el);\n",
       "    } else {\n",
       "        // location in version 2\n",
       "        IPython.keyboard_manager.register_events(el);\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
       "    // Check for shift+enter\n",
       "    if (event.shiftKey && event.which === 13) {\n",
       "        this.canvas_div.blur();\n",
       "        // select the cell after this one\n",
       "        var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
       "        IPython.notebook.select(index + 1);\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
       "    fig.ondownload(fig, null);\n",
       "};\n",
       "\n",
       "mpl.find_output_cell = function (html_output) {\n",
       "    // Return the cell and output element which can be found *uniquely* in the notebook.\n",
       "    // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
       "    // IPython event is triggered only after the cells have been serialised, which for\n",
       "    // our purposes (turning an active figure into a static one), is too late.\n",
       "    var cells = IPython.notebook.get_cells();\n",
       "    var ncells = cells.length;\n",
       "    for (var i = 0; i < ncells; i++) {\n",
       "        var cell = cells[i];\n",
       "        if (cell.cell_type === 'code') {\n",
       "            for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
       "                var data = cell.output_area.outputs[j];\n",
       "                if (data.data) {\n",
       "                    // IPython >= 3 moved mimebundle to data attribute of output\n",
       "                    data = data.data;\n",
       "                }\n",
       "                if (data['text/html'] === html_output) {\n",
       "                    return [cell, data, j];\n",
       "                }\n",
       "            }\n",
       "        }\n",
       "    }\n",
       "};\n",
       "\n",
       "// Register the function which deals with the matplotlib target/channel.\n",
       "// The kernel may be null if the page has been refreshed.\n",
       "if (IPython.notebook.kernel !== null) {\n",
       "    IPython.notebook.kernel.comm_manager.register_target(\n",
       "        'matplotlib',\n",
       "        mpl.mpl_figure_comm\n",
       "    );\n",
       "}\n"
      ],
      "text/plain": [
       "<IPython.core.display.Javascript object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<img src=\"\" width=\"432\">"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "[[<Figure size 432x288 with 6 Axes>]]"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "result.plot()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e743dadf",
   "metadata": {},
   "source": [
    "## 多因子选股的策略框架搭建\n",
    "\n",
    "\n",
    "### 以时间为键，股票id列表为值的交易模板搭建"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "id": "0b004086",
   "metadata": {},
   "outputs": [],
   "source": [
    "start=datetime(2018,2,22)\n",
    "end=datetime(2023,2,10)\n",
    "stock_list=[\"003002.SZ\",\"003003.SZ\",\"300001.SZ\"]\n",
    "buy_date={\"2020-09-22\":[\"003002.SZ\",\"003003.SZ\"]}\n",
    "sell_date={\"2023-02-02\":[\"003002.SZ\",\"003003.SZ\"]}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "id": "a04576fd",
   "metadata": {},
   "outputs": [],
   "source": [
    "#result=huice_run(start,end,stock_list,my_strategy_date)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "id": "592b9ce1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>volume</th>\n",
       "      <th>openinterest</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2020-09-22</th>\n",
       "      <td>9.8600</td>\n",
       "      <td>11.8400</td>\n",
       "      <td>9.8600</td>\n",
       "      <td>11.8400</td>\n",
       "      <td>2659.25</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2020-09-23</th>\n",
       "      <td>13.0200</td>\n",
       "      <td>13.0200</td>\n",
       "      <td>13.0200</td>\n",
       "      <td>13.0200</td>\n",
       "      <td>720.01</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2020-09-24</th>\n",
       "      <td>14.3200</td>\n",
       "      <td>14.3200</td>\n",
       "      <td>14.3200</td>\n",
       "      <td>14.3200</td>\n",
       "      <td>708.18</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2020-09-25</th>\n",
       "      <td>15.7500</td>\n",
       "      <td>15.7500</td>\n",
       "      <td>14.3200</td>\n",
       "      <td>15.0100</td>\n",
       "      <td>243874.54</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2020-09-28</th>\n",
       "      <td>14.0000</td>\n",
       "      <td>14.2900</td>\n",
       "      <td>13.5100</td>\n",
       "      <td>13.5100</td>\n",
       "      <td>154086.31</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-02-13</th>\n",
       "      <td>22.9680</td>\n",
       "      <td>23.5944</td>\n",
       "      <td>22.9158</td>\n",
       "      <td>23.3647</td>\n",
       "      <td>31574.99</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-02-14</th>\n",
       "      <td>23.3647</td>\n",
       "      <td>23.8241</td>\n",
       "      <td>23.0515</td>\n",
       "      <td>23.7928</td>\n",
       "      <td>28641.55</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-02-15</th>\n",
       "      <td>23.7614</td>\n",
       "      <td>24.1268</td>\n",
       "      <td>23.6153</td>\n",
       "      <td>23.8972</td>\n",
       "      <td>24071.00</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-02-16</th>\n",
       "      <td>23.6988</td>\n",
       "      <td>23.7823</td>\n",
       "      <td>22.6548</td>\n",
       "      <td>23.3856</td>\n",
       "      <td>43760.12</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-02-17</th>\n",
       "      <td>23.0202</td>\n",
       "      <td>23.0202</td>\n",
       "      <td>22.2476</td>\n",
       "      <td>22.5504</td>\n",
       "      <td>40138.75</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>581 rows × 6 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "               open     high      low    close     volume  openinterest\n",
       "date                                                                   \n",
       "2020-09-22   9.8600  11.8400   9.8600  11.8400    2659.25             0\n",
       "2020-09-23  13.0200  13.0200  13.0200  13.0200     720.01             0\n",
       "2020-09-24  14.3200  14.3200  14.3200  14.3200     708.18             0\n",
       "2020-09-25  15.7500  15.7500  14.3200  15.0100  243874.54             0\n",
       "2020-09-28  14.0000  14.2900  13.5100  13.5100  154086.31             0\n",
       "...             ...      ...      ...      ...        ...           ...\n",
       "2023-02-13  22.9680  23.5944  22.9158  23.3647   31574.99             0\n",
       "2023-02-14  23.3647  23.8241  23.0515  23.7928   28641.55             0\n",
       "2023-02-15  23.7614  24.1268  23.6153  23.8972   24071.00             0\n",
       "2023-02-16  23.6988  23.7823  22.6548  23.3856   43760.12             0\n",
       "2023-02-17  23.0202  23.0202  22.2476  22.5504   40138.75             0\n",
       "\n",
       "[581 rows x 6 columns]"
      ]
     },
     "execution_count": 114,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "get_data_0(\"003002.SZ\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d08693a0",
   "metadata": {},
   "source": [
    "### 对齐导入的不同股票数据，并填补数据中的空值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "9cbb60de",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['2020-10-13T00:00:00.000000000', '2020-10-14T00:00:00.000000000',\n",
       "       '2020-10-15T00:00:00.000000000', ...,\n",
       "       '2019-08-21T00:00:00.000000000', '2019-08-22T00:00:00.000000000',\n",
       "       '2019-08-23T00:00:00.000000000'], dtype='datetime64[ns]')"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "stock_daily.date.unique()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "0f1c1e36",
   "metadata": {},
   "outputs": [],
   "source": [
    "n1=len(stock_daily.date.unique())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "70062cda",
   "metadata": {},
   "outputs": [],
   "source": [
    "z1=pd.Series(range(0,n1),index=stock_daily.date.unique()).sort_index()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "6544c9b7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2018-01-02    843\n",
       "2018-01-03    844\n",
       "2018-01-04    845\n",
       "2018-01-05    846\n",
       "2018-01-08    847\n",
       "             ... \n",
       "2023-02-13    567\n",
       "2023-02-14    568\n",
       "2023-02-15    569\n",
       "2023-02-16    570\n",
       "2023-02-17    571\n",
       "Length: 1244, dtype: int64"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "z1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 136,
   "id": "b9f1bba2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>volume</th>\n",
       "      <th>openinterest</th>\n",
       "      <th>0</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2018-01-02</th>\n",
       "      <td>9.8600</td>\n",
       "      <td>11.8400</td>\n",
       "      <td>9.8600</td>\n",
       "      <td>11.8400</td>\n",
       "      <td>2659.25</td>\n",
       "      <td>0.0</td>\n",
       "      <td>843</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-03</th>\n",
       "      <td>9.8600</td>\n",
       "      <td>11.8400</td>\n",
       "      <td>9.8600</td>\n",
       "      <td>11.8400</td>\n",
       "      <td>2659.25</td>\n",
       "      <td>0.0</td>\n",
       "      <td>844</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-04</th>\n",
       "      <td>9.8600</td>\n",
       "      <td>11.8400</td>\n",
       "      <td>9.8600</td>\n",
       "      <td>11.8400</td>\n",
       "      <td>2659.25</td>\n",
       "      <td>0.0</td>\n",
       "      <td>845</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-05</th>\n",
       "      <td>9.8600</td>\n",
       "      <td>11.8400</td>\n",
       "      <td>9.8600</td>\n",
       "      <td>11.8400</td>\n",
       "      <td>2659.25</td>\n",
       "      <td>0.0</td>\n",
       "      <td>846</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2018-01-08</th>\n",
       "      <td>9.8600</td>\n",
       "      <td>11.8400</td>\n",
       "      <td>9.8600</td>\n",
       "      <td>11.8400</td>\n",
       "      <td>2659.25</td>\n",
       "      <td>0.0</td>\n",
       "      <td>847</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-02-13</th>\n",
       "      <td>22.9680</td>\n",
       "      <td>23.5944</td>\n",
       "      <td>22.9158</td>\n",
       "      <td>23.3647</td>\n",
       "      <td>31574.99</td>\n",
       "      <td>0.0</td>\n",
       "      <td>567</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-02-14</th>\n",
       "      <td>23.3647</td>\n",
       "      <td>23.8241</td>\n",
       "      <td>23.0515</td>\n",
       "      <td>23.7928</td>\n",
       "      <td>28641.55</td>\n",
       "      <td>0.0</td>\n",
       "      <td>568</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-02-15</th>\n",
       "      <td>23.7614</td>\n",
       "      <td>24.1268</td>\n",
       "      <td>23.6153</td>\n",
       "      <td>23.8972</td>\n",
       "      <td>24071.00</td>\n",
       "      <td>0.0</td>\n",
       "      <td>569</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-02-16</th>\n",
       "      <td>23.6988</td>\n",
       "      <td>23.7823</td>\n",
       "      <td>22.6548</td>\n",
       "      <td>23.3856</td>\n",
       "      <td>43760.12</td>\n",
       "      <td>0.0</td>\n",
       "      <td>570</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-02-17</th>\n",
       "      <td>23.0202</td>\n",
       "      <td>23.0202</td>\n",
       "      <td>22.2476</td>\n",
       "      <td>22.5504</td>\n",
       "      <td>40138.75</td>\n",
       "      <td>0.0</td>\n",
       "      <td>571</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>1244 rows × 7 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "               open     high      low    close    volume  openinterest    0\n",
       "2018-01-02   9.8600  11.8400   9.8600  11.8400   2659.25           0.0  843\n",
       "2018-01-03   9.8600  11.8400   9.8600  11.8400   2659.25           0.0  844\n",
       "2018-01-04   9.8600  11.8400   9.8600  11.8400   2659.25           0.0  845\n",
       "2018-01-05   9.8600  11.8400   9.8600  11.8400   2659.25           0.0  846\n",
       "2018-01-08   9.8600  11.8400   9.8600  11.8400   2659.25           0.0  847\n",
       "...             ...      ...      ...      ...       ...           ...  ...\n",
       "2023-02-13  22.9680  23.5944  22.9158  23.3647  31574.99           0.0  567\n",
       "2023-02-14  23.3647  23.8241  23.0515  23.7928  28641.55           0.0  568\n",
       "2023-02-15  23.7614  24.1268  23.6153  23.8972  24071.00           0.0  569\n",
       "2023-02-16  23.6988  23.7823  22.6548  23.3856  43760.12           0.0  570\n",
       "2023-02-17  23.0202  23.0202  22.2476  22.5504  40138.75           0.0  571\n",
       "\n",
       "[1244 rows x 7 columns]"
      ]
     },
     "execution_count": 136,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.concat([get_data_0(\"003002.SZ\"),z1],axis=1).fillna(method=\"bfill\").fillna(method=\"ffill\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "12e26d0e",
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_data_1(syboml):\n",
    "    stock=stock_daily[stock_daily[\"股票代码\"]==syboml][[\"open\",\"high\",\"low\",\"close\",\"volume\",\"openinterest\"]]\n",
    "    stock=pd.concat([stock,z1],axis=1).fillna(method=\"bfill\").fillna(method=\"ffill\")\n",
    "#    stock=pd.concat([get_data_0(\"003002.SZ\"),z1],axis=1).fillna(method=\"bfill\").fillna(method=\"ffill\")\n",
    "    return stock[[\"open\",\"high\",\"low\",\"close\",\"volume\",\"openinterest\"]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "c2d1e875",
   "metadata": {},
   "outputs": [],
   "source": [
    "#这是读入一个股票数据的策略，请改写为多个股票读入\n",
    "def huice_run_num(start,end,stock_list,strategy):\n",
    "\n",
    "    cerebro = bt.Cerebro()\n",
    "    for i in stock_list:\n",
    "        stock=get_data_1(i)\n",
    "        data = bt.feeds.PandasData(dataname=stock,fromdate=start,todate=end)           \n",
    "        cerebro.adddata(data,name=i) \n",
    "        \n",
    "    cerebro.addstrategy(strategy) \n",
    "    cerebro.broker.setcash(100000) \n",
    "    cerebro.broker.setcommission(commission=0.002) \n",
    "\n",
    "\n",
    "    print(start.date(),end.date())\n",
    "    print('初始资金: %.2f' % cerebro.broker.getvalue())\n",
    "    cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name = 'SharpeRatio')\n",
    "    cerebro.addanalyzer(bt.analyzers.DrawDown, _name='DW')\n",
    "    results = cerebro.run()\n",
    "    strat = results[0]\n",
    "    print('最终资金: %.2f' % cerebro.broker.getvalue())\n",
    "    print('夏普比率:', strat.analyzers.SharpeRatio.get_analysis())\n",
    "    print('回撤指标:', strat.analyzers.DW.get_analysis())\n",
    "    \n",
    "    return cerebro"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "id": "8efcb0fb",
   "metadata": {},
   "outputs": [],
   "source": [
    "#原始事件策略模板，请基于此改写\n",
    "class my_strategy_date_1(bt.Strategy):\n",
    "    #全局设定交易策略的参数\n",
    "\n",
    "    def __init__(self):\n",
    "        # 初始化交易指令、买卖价格和手续费\n",
    "        self.order = None\n",
    "\n",
    "    def next(self):\n",
    "        # 检查是否持仓 \n",
    "        #print(str(self.datetime.date(0)))\n",
    "        if str(self.datetime.date(0)) in sell_date.keys(): \n",
    "            s_list=sell_date[str(self.datetime.date(0))]\n",
    "            for i in s_list:\n",
    "                self.order_target_percent(target=0,data=i)\n",
    "        if str(self.datetime.date(0)) in buy_date.keys(): \n",
    "            s_list=buy_date[str(self.datetime.date(0))]\n",
    "            for i in s_list:\n",
    "                self.order_target_percent(target=0.9/len(s_list),data=i)\n",
    "                \n",
    "\n",
    "            \n",
    "    def log(self, txt, dt=None):\n",
    "        ''' 输出日志'''\n",
    "        dt = dt or self.datas[0].datetime.date(0) # 拿现在的日期\n",
    "        print('%s, %s' % (dt.isoformat(), txt))\n",
    "\n",
    "    def notify_order(self, order):\n",
    "        if order.status in [order.Submitted, order.Accepted]:\n",
    "            # Buy/Sell order submitted/accepted to/by broker - Nothing to do\n",
    "            return\n",
    "\n",
    "        # Check if an order has been completed\n",
    "        # Attention: broker could reject order if not enough cash\n",
    "        if order.status in [order.Completed, order.Canceled, order.Margin]:\n",
    "            if order.isbuy():\n",
    "                self.log(f\"\"\"买入{order.data._name}, 成交量{order.executed.size}，成交价{order.executed.price:.2f}\"\"\")\n",
    "            elif order.issell():\n",
    "                self.log(f\"\"\"卖出{order.data._name}, 成交量{order.executed.size}，成交价{order.executed.price:.2f}\"\"\")\n",
    "            self.bar_executed = len(self)\n",
    "\n",
    "        # Write down: no pending order\n",
    "        self.order = None"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "ed436e06",
   "metadata": {},
   "outputs": [],
   "source": [
    "start=datetime(2018,2,22)\n",
    "end=datetime(2023,2,10)\n",
    "stock_list=[\"003002.SZ\",\"003003.SZ\",\"300001.SZ\"]\n",
    "buy_date={\"2020-09-22\":[\"003002.SZ\",\"003003.SZ\"]}\n",
    "sell_date={\"2023-02-02\":[\"003002.SZ\",\"003003.SZ\"]}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "53ebba7a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2018-02-22 2023-02-10\n",
      "初始资金: 100000.00\n",
      "2020-09-23, 买入003002.SZ, 成交量3800，成交价13.02\n",
      "2020-09-23, 买入003003.SZ, 成交量2707，成交价18.28\n",
      "2023-02-03, 卖出003002.SZ, 成交量-3800，成交价20.89\n",
      "2023-02-03, 卖出003003.SZ, 成交量-2707，成交价12.09\n",
      "最终资金: 112731.75\n",
      "夏普比率: OrderedDict([('sharperatio', 0.13880099293497766)])\n",
      "回撤指标: AutoOrderedDict([('len', 58), ('drawdown', 8.111117263713433), ('moneydown', 9950.936514), ('max', AutoOrderedDict([('len', 455), ('drawdown', 47.599755296618), ('moneydown', 56371.585799999986)]))])\n"
     ]
    }
   ],
   "source": [
    "result=huice_run_num(start,end,stock_list,my_strategy_date_1)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3fe342df",
   "metadata": {},
   "source": [
    "## 单因子策略\n",
    "\n",
    "### 市值\n",
    "\n",
    "市值，是指一家上市公司的发行股份按市场价格计算出来的股票总价值，其计算方法为每股股票的市场价格乘以发行总股数。整个股市上所有上市公司的市值总和，即为股票总市值。\n",
    "\n",
    "* 以某个时间段为周期，基于市值因子排序选择特定股票买入和抛出"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "0708545d",
   "metadata": {},
   "outputs": [],
   "source": [
    "time_30=pd.Series(stock_daily.date.unique()).sort_values().tolist()[::30]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "43f77ea4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['300684.SZ', '300029.SZ', '300106.SZ', '300354.SZ', '300028.SZ']"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "stock_daily[stock_daily.date==time_30[0]].sort_values(by=\"总市值(万元)\").head(5)[\"股票代码\"].tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "a21ac6d6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['300106.SZ', '300028.SZ', '300354.SZ', '300029.SZ', '300489.SZ']"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "stock_daily[stock_daily.date==time_30[1]].sort_values(by=\"总市值(万元)\").head(5)[\"股票代码\"].tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "da263627",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['index', 'date', '股票代码', '股票简称', 'open', 'high', 'low', 'close',\n",
       "       'volume', '成交额(千元)', '换手率(%)', '量比', '市盈率(静态)', '市盈率(TTM)', '市盈率(动态)',\n",
       "       '市净率', '市销率', '市销率(TTM)', '股息率(%)', '股息率(TTM)(%)', '总股本(万股)',\n",
       "       '流通股本(万股)', '总市值(万元)', '流通市值(万元)', 'openinterest'],\n",
       "      dtype='object')"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "start=datetime(2018,2,22)\n",
    "end=datetime(2023,2,10)\n",
    "stock_list=[\"003002.SZ\",\"003003.SZ\",\"300001.SZ\"]\n",
    "buy_date={\"2020-09-22\":[\"003002.SZ\",\"003003.SZ\"]}\n",
    "sell_date={\"2023-02-02\":[\"003002.SZ\",\"003003.SZ\"]}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "id": "e6ffa026",
   "metadata": {},
   "outputs": [],
   "source": [
    "start=datetime(2018,1,2)\n",
    "end=datetime(2023,2,10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "bb152573",
   "metadata": {},
   "outputs": [],
   "source": [
    "time_30=pd.Series(stock_daily.date.unique()).sort_values().tolist()[::30]\n",
    "buy_date={}\n",
    "sell_date={}\n",
    "postion=set([])\n",
    "stock_list=set([])\n",
    "for i in time_30:\n",
    "    buy_list=stock_daily[stock_daily.date==i].sort_values(by=\"总市值(万元)\").head(5)[\"股票代码\"].tolist()\n",
    "    buy_date.update({str(i.date()):buy_list})\n",
    "    sell_list=list(postion-set(buy_list))\n",
    "    sell_date.update({str(i.date()):sell_list})\n",
    "    postion=set(buy_list)\n",
    "    stock_list=stock_list|set(buy_list)\n",
    "stock_list=list(stock_list)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "id": "f5ece523",
   "metadata": {},
   "outputs": [],
   "source": [
    "#buy_date"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "id": "ecf928f8",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2018-01-02 2023-02-10\n",
      "初始资金: 100000.00\n",
      "2018-01-03, 买入300684.SZ, 成交量1174，成交价16.86\n",
      "2018-01-03, 买入300029.SZ, 成交量2294，成交价7.86\n",
      "2018-01-03, 买入300106.SZ, 成交量1497，成交价12.03\n",
      "2018-01-03, 买入300354.SZ, 成交量443，成交价40.60\n",
      "2018-01-03, 买入300028.SZ, 成交量1437，成交价12.62\n",
      "2018-02-14, 卖出300684.SZ, 成交量-1174，成交价39.98\n",
      "2018-02-14, 买入300106.SZ, 成交量640，成交价9.47\n",
      "2018-02-14, 买入300028.SZ, 成交量670，成交价9.60\n",
      "2018-02-14, 买入300354.SZ, 成交量196，成交价31.57\n",
      "2018-02-14, 买入300029.SZ, 成交量577，成交价7.11\n",
      "2018-02-14, 买入300489.SZ, 成交量659，成交价31.56\n",
      "2018-04-04, 卖出300354.SZ, 成交量-639，成交价44.34\n",
      "2018-04-04, 买入300106.SZ, 成交量131，成交价10.29\n",
      "2018-04-04, 买入300028.SZ, 成交量106，成交价10.40\n",
      "2018-04-04, 买入300321.SZ, 成交量634，成交价36.82\n",
      "2018-04-04, 卖出300029.SZ, 成交量-114，成交价8.39\n",
      "2018-05-22, 卖出300489.SZ, 成交量-659，成交价36.05\n",
      "2018-05-22, 买入300106.SZ, 成交量35，成交价10.16\n",
      "2018-05-22, 买入300029.SZ, 成交量313，成交价7.53\n",
      "2018-05-22, 卖出300028.SZ, 成交量-47，成交价10.74\n",
      "2018-05-22, 买入300354.SZ, 成交量614，成交价37.70\n",
      "2018-07-04, 卖出300354.SZ, 成交量-614，成交价31.60\n",
      "2018-07-04, 买入300028.SZ, 成交量1727，成交价4.03\n",
      "2018-07-04, 卖出300106.SZ, 成交量-132，成交价8.05\n",
      "2018-07-04, 卖出300029.SZ, 成交量-46，成交价5.76\n",
      "2018-07-04, 卖出300321.SZ, 成交量-46，成交价29.87\n",
      "2018-07-04, 买入300489.SZ, 成交量604，成交价28.86\n",
      "2018-08-15, 卖出300028.SZ, 成交量-3893，成交价1.67\n",
      "2018-08-15, 卖出300029.SZ, 成交量-287，成交价5.73\n",
      "2018-08-15, 卖出300106.SZ, 成交量-388，成交价8.88\n",
      "2018-08-15, 卖出300321.SZ, 成交量-46，成交价29.24\n",
      "2018-08-15, 买入300069.SZ, 成交量731，成交价21.46\n",
      "2018-08-15, 卖出300489.SZ, 成交量-43，成交价28.14\n",
      "2018-09-27, 卖出300069.SZ, 成交量-731，成交价22.74\n",
      "2018-09-27, 卖出300106.SZ, 成交量-1783，成交价9.50\n",
      "2018-09-27, 卖出300489.SZ, 成交量-561，成交价29.06\n",
      "2018-09-27, 买入300029.SZ, 成交量116，成交价5.66\n",
      "2018-09-27, 买入300321.SZ, 成交量23，成交价28.70\n",
      "2018-09-27, 买入300405.SZ, 成交量1013，成交价15.98\n",
      "2018-09-27, 买入300592.SZ, 成交量1581，成交价10.25\n",
      "2018-09-27, 买入300573.SZ, 成交量995，成交价16.29\n",
      "2018-11-15, 卖出300573.SZ, 成交量-995，成交价17.24\n",
      "2018-11-15, 卖出300405.SZ, 成交量-1013，成交价16.57\n",
      "2018-11-15, 卖出300029.SZ, 成交量-43，成交价5.86\n",
      "2018-11-15, 买入300489.SZ, 成交量616，成交价27.05\n",
      "2018-11-15, 买入300321.SZ, 成交量5，成交价28.84\n",
      "2018-11-15, 买入300592.SZ, 成交量15，成交价10.37\n",
      "2018-11-15, 买入300106.SZ, 成交量1818，成交价9.04\n",
      "2018-12-27, 卖出300321.SZ, 成交量-570，成交价27.04\n",
      "2018-12-27, 买入300029.SZ, 成交量248，成交价4.95\n",
      "2018-12-27, 卖出300489.SZ, 成交量-1，成交价24.51\n",
      "2018-12-27, 买入300106.SZ, 成交量10，成交价8.28\n",
      "2018-12-27, 买入300354.SZ, 成交量563，成交价26.65\n",
      "2019-02-18, 卖出300354.SZ, 成交量-563，成交价28.40\n",
      "2019-02-18, 卖出300106.SZ, 成交量-1828，成交价8.72\n",
      "2019-02-18, 买入300029.SZ, 成交量36，成交价4.93\n",
      "2019-02-18, 买入300489.SZ, 成交量15，成交价24.26\n",
      "2019-02-18, 买入300592.SZ, 成交量52，成交价9.29\n",
      "2019-02-18, 买入300405.SZ, 成交量1038，成交价14.63\n",
      "2019-02-18, 买入300321.SZ, 成交量547，成交价27.83\n",
      "2019-04-01, 卖出300321.SZ, 成交量-547，成交价33.30\n",
      "2019-04-01, 卖出300029.SZ, 成交量-29，成交价6.06\n",
      "2019-04-01, 卖出300405.SZ, 成交量-7，成交价17.85\n",
      "2019-04-01, 卖出300592.SZ, 成交量-34，成交价11.50\n",
      "2019-04-01, 卖出300489.SZ, 成交量-34，成交价30.93\n",
      "2019-04-01, 买入300665.SZ, 成交量999，成交价18.39\n",
      "2019-05-17, 卖出300405.SZ, 成交量-1031，成交价33.34\n",
      "2019-05-17, 卖出300489.SZ, 成交量-596，成交价34.06\n",
      "2019-05-17, 买入300029.SZ, 成交量402，成交价6.44\n",
      "2019-05-17, 买入300592.SZ, 成交量485，成交价10.41\n",
      "2019-05-17, 买入300665.SZ, 成交量219，成交价17.86\n",
      "2019-05-17, 买入300321.SZ, 成交量679，成交价32.00\n",
      "2019-05-17, 买入300535.SZ, 成交量915，成交价24.01\n",
      "2019-07-01, 卖出300535.SZ, 成交量-915，成交价24.51\n",
      "2019-07-01, 卖出300592.SZ, 成交量-116，成交价11.22\n",
      "2019-07-01, 卖出300029.SZ, 成交量-277，成交价7.00\n",
      "2019-07-01, 买入300321.SZ, 成交量15，成交价31.99\n",
      "2019-07-01, 卖出300665.SZ, 成交量-3，成交价18.29\n",
      "2019-07-01, 买入300442.SZ, 成交量1522，成交价14.64\n",
      "2019-08-12, 买入300029.SZ, 成交量85，成交价5.99\n",
      "2019-08-12, 买入300665.SZ, 成交量46，成交价15.72\n",
      "2019-08-12, 买入300592.SZ, 成交量45，成交价9.84\n",
      "2019-08-12, 卖出300321.SZ, 成交量-4，成交价28.78\n",
      "2019-08-12, 卖出300442.SZ, 成交量-32，成交价13.30\n",
      "2019-09-24, 卖出300442.SZ, 成交量-1490，成交价15.26\n",
      "2019-09-24, 买入300665.SZ, 成交量45，成交价16.87\n",
      "2019-09-24, 卖出300029.SZ, 成交量-52，成交价6.96\n",
      "2019-09-24, 卖出300321.SZ, 成交量-1，成交价32.26\n",
      "2019-09-24, 卖出300592.SZ, 成交量-88，成交价11.38\n",
      "2019-09-24, 买入300362.SZ, 成交量2320，成交价9.34\n",
      "2019-11-12, 卖出300592.SZ, 成交量-1940，成交价12.30\n",
      "2019-11-12, 卖出300362.SZ, 成交量-2320，成交价9.16\n",
      "2019-11-12, 卖出300321.SZ, 成交量-689，成交价32.41\n",
      "2019-11-12, 卖出300029.SZ, 成交量-3223，成交价7.03\n",
      "2019-11-12, 买入300665.SZ, 成交量93，成交价16.01\n",
      "2019-11-12, 买入300431.SZ, 成交量2267，成交价9.60\n",
      "2019-11-12, 买入300106.SZ, 成交量2360，成交价9.47\n",
      "2019-11-12, 买入300069.SZ, 成交量969，成交价23.15\n",
      "2019-11-12, 买入300535.SZ, 成交量999，成交价22.30\n",
      "2019-12-24, 卖出300535.SZ, 成交量-999，成交价22.71\n",
      "2019-12-24, 卖出300069.SZ, 成交量-969，成交价31.83\n",
      "2019-12-24, 买入300431.SZ, 成交量384，成交价8.94\n",
      "2019-12-24, 买入300362.SZ, 成交量2934，成交价7.99\n",
      "2019-12-24, 买入300665.SZ, 成交量31，成交价16.59\n",
      "2019-12-24, 买入300029.SZ, 成交量3569，成交价6.66\n",
      "2019-12-24, 买入300106.SZ, 成交量94，成交价9.65\n",
      "2020-02-13, 买入300362.SZ, 成交量108，成交价7.02\n",
      "2020-02-13, 卖出300431.SZ, 成交量-108，成交价9.28\n",
      "2020-02-13, 买入300029.SZ, 成交量189，成交价5.74\n",
      "2020-02-13, 买入300106.SZ, 成交量108，成交价8.51\n",
      "2020-02-13, 卖出300665.SZ, 成交量-37，成交价15.59\n",
      "2020-03-26, 卖出300029.SZ, 成交量-3758，成交价7.11\n",
      "2020-03-26, 卖出300106.SZ, 成交量-2562，成交价9.62\n",
      "2020-03-26, 买入300362.SZ, 成交量816，成交价5.76\n",
      "2020-03-26, 买入300431.SZ, 成交量419，成交价7.40\n",
      "2020-03-26, 买入300736.SZ, 成交量950，成交价23.38\n",
      "2020-03-26, 卖出300665.SZ, 成交量-90，成交价16.77\n",
      "2020-03-26, 买入300156.SZ, 成交量1861，成交价11.95\n",
      "2020-05-13, 卖出300362.SZ, 成交量-3858，成交价3.57\n",
      "2020-05-13, 买入300431.SZ, 成交量492，成交价4.89\n",
      "2020-05-13, 买入300156.SZ, 成交量552，成交价6.89\n",
      "2020-05-13, 买入300029.SZ, 成交量3052，成交价5.59\n",
      "2020-05-13, 卖出300736.SZ, 成交量-154，成交价21.50\n",
      "2020-05-13, 卖出300665.SZ, 成交量-208，成交价15.59\n",
      "2020-06-24, 卖出300156.SZ, 成交量-2413，成交价2.67\n",
      "2020-06-24, 买入300028.SZ, 成交量12585，成交价1.09\n",
      "2020-06-24, 卖出300431.SZ, 成交量-153，成交价4.55\n",
      "2020-06-24, 卖出300029.SZ, 成交量-328，成交价5.58\n",
      "2020-06-24, 卖出300665.SZ, 成交量-140，成交价15.90\n",
      "2020-06-24, 卖出300736.SZ, 成交量-127，成交价22.86\n",
      "2020-08-07, 卖出300736.SZ, 成交量-669，成交价26.11\n",
      "2020-08-07, 卖出300028.SZ, 成交量-12585，成交价0.75\n",
      "2020-08-07, 卖出300431.SZ, 成交量-3301，成交价3.12\n",
      "2020-08-07, 卖出300029.SZ, 成交量-2724，成交价6.65\n",
      "2020-08-07, 买入300156.SZ, 成交量12560，成交价1.20\n",
      "2020-08-07, 买入300090.SZ, 成交量15853，成交价0.95\n",
      "2020-08-07, 买入300216.SZ, 成交量907，成交价14.88\n",
      "2020-08-07, 卖出300665.SZ, 成交量-118，成交价17.87\n",
      "2020-08-07, 买入300535.SZ, 成交量664，成交价22.53\n",
      "2020-09-18, 卖出300535.SZ, 成交量-664，成交价26.99\n",
      "2020-09-18, 卖出300156.SZ, 成交量-12560，成交价1.20\n",
      "2020-09-18, 卖出300216.SZ, 成交量-907，成交价0.91\n",
      "2020-09-18, 卖出300090.SZ, 成交量-15853，成交价0.87\n",
      "2020-09-18, 买入300029.SZ, 成交量2448，成交价5.37\n",
      "2020-09-18, 买入300736.SZ, 成交量448，成交价29.39\n",
      "2020-09-18, 卖出300665.SZ, 成交量-216，成交价21.02\n",
      "2020-09-18, 买入300446.SZ, 成交量472，成交价27.82\n",
      "2020-09-18, 买入300716.SZ, 成交量839，成交价15.62\n",
      "2020-11-09, 卖出300665.SZ, 成交量-621，成交价23.54\n",
      "2020-11-09, 卖出300716.SZ, 成交量-839，成交价16.85\n",
      "2020-11-09, 卖出300446.SZ, 成交量-472，成交价33.44\n",
      "2020-11-09, 买入300431.SZ, 成交量19051，成交价0.77\n",
      "2020-11-09, 买入300029.SZ, 成交量148，成交价5.62\n",
      "2020-11-09, 买入300268.SZ, 成交量587，成交价24.93\n",
      "2020-11-09, 卖出300736.SZ, 成交量-9，成交价33.54\n",
      "2020-11-09, 买入300478.SZ, 成交量544，成交价26.62\n",
      "2020-12-21, 卖出300431.SZ, 成交量-19051，成交价0.77\n",
      "2020-12-21, 卖出300268.SZ, 成交量-587，成交价26.96\n",
      "2020-12-21, 卖出300029.SZ, 成交量-90，成交价5.22\n",
      "2020-12-21, 买入300478.SZ, 成交量142，成交价19.21\n",
      "2020-12-21, 买入300736.SZ, 成交量88，成交价24.81\n",
      "2020-12-21, 买入300665.SZ, 成交量709，成交价18.45\n",
      "2020-12-21, 买入300716.SZ, 成交量962，成交价13.73\n",
      "2021-02-02, 卖出300665.SZ, 成交量-709，成交价16.08\n",
      "2021-02-02, 买入300736.SZ, 成交量99，成交价17.63\n",
      "2021-02-02, 卖出300029.SZ, 成交量-325，成交价5.06\n",
      "2021-02-02, 买入300478.SZ, 成交量45，成交价15.07\n",
      "2021-02-02, 买入300312.SZ, 成交量1071，成交价10.37\n",
      "2021-02-02, 买入300716.SZ, 成交量102，成交价10.53\n",
      "2021-03-23, 卖出300716.SZ, 成交量-1064，成交价13.04\n",
      "2021-03-23, 卖出300312.SZ, 成交量-1071，成交价18.40\n",
      "2021-03-23, 买入300736.SZ, 成交量94，成交价19.16\n",
      "2021-03-23, 买入300029.SZ, 成交量240，成交价5.69\n",
      "2021-03-23, 买入300478.SZ, 成交量76，成交价17.13\n",
      "2021-03-23, 买入300167.SZ, 成交量449，成交价30.96\n",
      "2021-03-23, 买入300588.SZ, 成交量1069，成交价12.89\n",
      "2021-05-10, 卖出300167.SZ, 成交量-449，成交价27.48\n",
      "2021-05-10, 卖出300588.SZ, 成交量-1069，成交价13.16\n",
      "2021-05-10, 买入300312.SZ, 成交量1509，成交价9.40\n",
      "2021-05-10, 卖出300736.SZ, 成交量-20，成交价18.74\n",
      "2021-05-10, 买入300029.SZ, 成交量152，成交价5.10\n",
      "2021-05-10, 卖出300478.SZ, 成交量-5，成交价16.09\n",
      "2021-05-10, 买入300051.SZ, 成交量643，成交价20.11\n",
      "2021-06-22, 卖出300736.SZ, 成交量-700，成交价31.44\n",
      "2021-06-22, 买入300029.SZ, 成交量652，成交价4.65\n",
      "2021-06-22, 卖出300312.SZ, 成交量-88，成交价10.58\n",
      "2021-06-22, 买入300478.SZ, 成交量38，成交价17.98\n",
      "2021-06-22, 买入300051.SZ, 成交量62，成交价21.49\n",
      "2021-06-22, 买入300356.SZ, 成交量1208，成交价12.56\n",
      "2021-08-03, 卖出300356.SZ, 成交量-1208，成交价12.10\n",
      "2021-08-03, 买入300312.SZ, 成交量241，成交价9.22\n",
      "2021-08-03, 卖出300029.SZ, 成交量-592，成交价6.03\n",
      "2021-08-03, 买入300478.SZ, 成交量16，成交价17.94\n",
      "2021-08-03, 买入300051.SZ, 成交量27，成交价20.99\n",
      "2021-08-03, 买入300362.SZ, 成交量6246，成交价2.46\n",
      "2021-09-14, 卖出300362.SZ, 成交量-6246，成交价3.96\n",
      "2021-09-14, 买入300312.SZ, 成交量216，成交价9.43\n",
      "2021-09-14, 买入300478.SZ, 成交量146，成交价17.84\n",
      "2021-09-14, 买入300029.SZ, 成交量69，成交价6.59\n",
      "2021-09-14, 买入300051.SZ, 成交量28，成交价23.57\n",
      "2021-09-14, 买入300071.SZ, 成交量780，成交价23.15\n",
      "2021-11-04, 卖出300051.SZ, 成交量-760，成交价26.77\n",
      "2021-11-04, 卖出300071.SZ, 成交量-780，成交价27.05\n",
      "2021-11-04, 买入300312.SZ, 成交量211，成交价8.76\n",
      "2021-11-04, 买入300029.SZ, 成交量415，成交价5.79\n",
      "2021-11-04, 卖出300478.SZ, 成交量-5，成交价18.25\n",
      "2021-11-04, 买入300356.SZ, 成交量1516，成交价11.98\n",
      "2021-11-04, 买入300654.SZ, 成交量1234，成交价14.87\n",
      "2021-12-16, 卖出300654.SZ, 成交量-1234，成交价17.23\n",
      "2021-12-16, 买入300312.SZ, 成交量100，成交价9.07\n",
      "2021-12-16, 卖出300029.SZ, 成交量-57，成交价6.44\n",
      "2021-12-16, 买入300478.SZ, 成交量18，成交价19.46\n",
      "2021-12-16, 卖出300356.SZ, 成交量-31，成交价13.25\n",
      "2021-12-16, 买入300254.SZ, 成交量2046，成交价9.59\n",
      "2022-01-28, 卖出300254.SZ, 成交量-2046，成交价11.59\n",
      "2022-01-28, 买入300178.SZ, 成交量3226，成交价6.26\n",
      "2022-01-28, 卖出300312.SZ, 成交量-59，成交价9.76\n",
      "2022-01-28, 买入300029.SZ, 成交量315，成交价6.02\n",
      "2022-01-28, 买入300356.SZ, 成交量285，成交价11.53\n",
      "2022-01-28, 卖出300478.SZ, 成交量-23，成交价20.54\n",
      "2022-03-18, 卖出300478.SZ, 成交量-992，成交价21.24\n",
      "2022-03-18, 卖出300178.SZ, 成交量-52，成交价6.21\n",
      "2022-03-18, 买入300312.SZ, 成交量17，成交价8.97\n",
      "2022-03-18, 买入300029.SZ, 成交量25，成交价5.86\n",
      "2022-03-18, 买入300356.SZ, 成交量43，成交价10.95\n",
      "2022-03-18, 买入300495.SZ, 成交量1324，成交价14.99\n",
      "2022-05-06, 卖出300312.SZ, 成交量-2147，成交价1.00\n",
      "2022-05-06, 卖出300178.SZ, 成交量-3174，成交价1.46\n",
      "2022-05-06, 卖出300029.SZ, 成交量-3400，成交价6.08\n",
      "2022-05-06, 卖出300356.SZ, 成交量-157，成交价6.93\n",
      "2022-05-06, 卖出300495.SZ, 成交量-204，成交价10.07\n",
      "2022-05-06, 买入300336.SZ, 成交量1440，成交价8.18\n",
      "2022-05-06, 买入300338.SZ, 成交量934，成交价10.11\n",
      "2022-05-06, 买入300309.SZ, 成交量1380，成交价8.54\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2022-06-20, 卖出300309.SZ, 成交量-1380，成交价13.14\n",
      "2022-06-20, 卖出300356.SZ, 成交量-1656，成交价7.58\n",
      "2022-06-20, 卖出300336.SZ, 成交量-1440，成交价11.07\n",
      "2022-06-20, 卖出300495.SZ, 成交量-1120，成交价18.61\n",
      "2022-06-20, 卖出300338.SZ, 成交量-934，成交价12.40\n",
      "2022-06-20, 买入300312.SZ, 成交量14496，成交价1.09\n",
      "2022-06-20, 买入300178.SZ, 成交量15744，成交价1.00\n",
      "2022-06-20, 买入300325.SZ, 成交量5499，成交价2.88\n",
      "2022-06-20, 买入300202.SZ, 成交量3753，成交价4.35\n",
      "2022-06-20, 买入300367.SZ, 成交量2974，成交价5.32\n",
      "2022-08-01, 卖出300312.SZ, 成交量-14496，成交价0.97\n",
      "2022-08-01, 卖出300367.SZ, 成交量-2974，成交价5.14\n",
      "2022-08-01, 卖出300325.SZ, 成交量-5499，成交价2.36\n",
      "2022-08-01, 卖出300202.SZ, 成交量-3753，成交价3.47\n",
      "2022-08-01, 卖出300178.SZ, 成交量-15744，成交价1.00\n",
      "2022-08-01, 买入300338.SZ, 成交量1099，成交价12.75\n",
      "2022-08-01, 买入300356.SZ, 成交量1425，成交价9.88\n",
      "2022-08-01, 买入300392.SZ, 成交量773，成交价17.94\n",
      "2022-08-01, 买入300282.SZ, 成交量969，成交价14.31\n",
      "2022-08-01, 买入300336.SZ, 成交量1280，成交价10.94\n",
      "2022-09-13, 卖出300336.SZ, 成交量-1280，成交价12.86\n",
      "2022-09-13, 卖出300356.SZ, 成交量-1425，成交价14.01\n",
      "2022-09-13, 买入300330.SZ, 成交量1328，成交价13.20\n",
      "2022-09-13, 买入300392.SZ, 成交量68，成交价20.71\n",
      "2022-09-13, 买入300478.SZ, 成交量867，成交价20.25\n",
      "2022-09-13, 卖出300338.SZ, 成交量-123，成交价18.16\n",
      "2022-09-13, 买入300282.SZ, 成交量69，成交价16.93\n",
      "2022-11-01, 卖出300392.SZ, 成交量-841，成交价24.68\n",
      "2022-11-01, 卖出300282.SZ, 成交量-1038，成交价24.81\n",
      "2022-11-01, 卖出300338.SZ, 成交量-976，成交价18.20\n",
      "2022-11-01, 买入300330.SZ, 成交量298，成交价11.49\n",
      "2022-11-01, 买入300108.SZ, 成交量1745，成交价10.83\n",
      "2022-11-01, 买入300309.SZ, 成交量1851，成交价10.15\n",
      "2022-11-01, 买入300478.SZ, 成交量139，成交价18.88\n",
      "2022-11-01, 买入300321.SZ, 成交量581，成交价32.47\n",
      "2022-12-13, 卖出300321.SZ, 成交量-581，成交价34.74\n",
      "2022-12-13, 卖出300108.SZ, 成交量-1745，成交价14.76\n",
      "2022-12-13, 买入300330.SZ, 成交量22，成交价12.94\n",
      "2022-12-13, 买入300478.SZ, 成交量84，成交价19.50\n",
      "2022-12-13, 买入300309.SZ, 成交量64，成交价11.32\n",
      "2022-12-13, 买入300555.SZ, 成交量1231，成交价17.23\n",
      "2022-12-13, 买入300336.SZ, 成交量1807，成交价11.83\n",
      "2023-02-01, 卖出300336.SZ, 成交量-1807，成交价13.27\n",
      "2023-02-01, 卖出300555.SZ, 成交量-1231，成交价15.77\n",
      "2023-02-01, 卖出300330.SZ, 成交量-1648，成交价11.72\n",
      "2023-02-01, 买入300309.SZ, 成交量1243，成交价6.28\n",
      "2023-02-01, 买入300089.SZ, 成交量2540，成交价7.28\n",
      "2023-02-01, 卖出300478.SZ, 成交量-79，成交价19.19\n",
      "2023-02-01, 买入300392.SZ, 成交量963，成交价20.11\n",
      "2023-02-01, 买入300899.SZ, 成交量869，成交价22.37\n",
      "最终资金: 121312.21\n",
      "夏普比率: OrderedDict([('sharperatio', 0.24864566846051778)])\n",
      "回撤指标: AutoOrderedDict([('len', 1218), ('drawdown', 18.807842830097513), ('moneydown', 28101.49425819995), ('max', AutoOrderedDict([('len', 1218), ('drawdown', 63.157182350532885), ('moneydown', 94365.484294)]))])\n"
     ]
    }
   ],
   "source": [
    "result=huice_run_num(start,end,stock_list,my_strategy_date_1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "eb32fbe3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "47"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(stock_list)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "1d8054ae",
   "metadata": {},
   "outputs": [],
   "source": [
    "#buy_date"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "id": "b228b0ba",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>股票代码</th>\n",
       "      <th>市盈率(静态)</th>\n",
       "      <th>市盈率(TTM)</th>\n",
       "      <th>市盈率(动态)</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2020-10-13</th>\n",
       "      <td>003001.SZ</td>\n",
       "      <td>32.8391</td>\n",
       "      <td>31.8466</td>\n",
       "      <td>32.47</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2020-10-14</th>\n",
       "      <td>003001.SZ</td>\n",
       "      <td>36.1208</td>\n",
       "      <td>35.0291</td>\n",
       "      <td>35.71</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2020-10-15</th>\n",
       "      <td>003001.SZ</td>\n",
       "      <td>32.5820</td>\n",
       "      <td>31.5973</td>\n",
       "      <td>32.21</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2020-10-16</th>\n",
       "      <td>003001.SZ</td>\n",
       "      <td>31.7125</td>\n",
       "      <td>30.7540</td>\n",
       "      <td>31.35</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2020-10-19</th>\n",
       "      <td>003001.SZ</td>\n",
       "      <td>29.8297</td>\n",
       "      <td>28.9281</td>\n",
       "      <td>29.49</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2021-07-28</th>\n",
       "      <td>003001.SZ</td>\n",
       "      <td>26.3160</td>\n",
       "      <td>25.5447</td>\n",
       "      <td>42.18</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2021-07-29</th>\n",
       "      <td>003001.SZ</td>\n",
       "      <td>26.4421</td>\n",
       "      <td>25.6672</td>\n",
       "      <td>42.38</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2021-07-30</th>\n",
       "      <td>003001.SZ</td>\n",
       "      <td>27.0224</td>\n",
       "      <td>26.2305</td>\n",
       "      <td>43.31</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2021-08-02</th>\n",
       "      <td>003001.SZ</td>\n",
       "      <td>27.6028</td>\n",
       "      <td>26.7938</td>\n",
       "      <td>44.24</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2021-08-03</th>\n",
       "      <td>003001.SZ</td>\n",
       "      <td>27.8929</td>\n",
       "      <td>27.0754</td>\n",
       "      <td>44.70</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>200 rows × 4 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                 股票代码  市盈率(静态)  市盈率(TTM)  市盈率(动态)\n",
       "date                                             \n",
       "2020-10-13  003001.SZ  32.8391   31.8466    32.47\n",
       "2020-10-14  003001.SZ  36.1208   35.0291    35.71\n",
       "2020-10-15  003001.SZ  32.5820   31.5973    32.21\n",
       "2020-10-16  003001.SZ  31.7125   30.7540    31.35\n",
       "2020-10-19  003001.SZ  29.8297   28.9281    29.49\n",
       "...               ...      ...       ...      ...\n",
       "2021-07-28  003001.SZ  26.3160   25.5447    42.18\n",
       "2021-07-29  003001.SZ  26.4421   25.6672    42.38\n",
       "2021-07-30  003001.SZ  27.0224   26.2305    43.31\n",
       "2021-08-02  003001.SZ  27.6028   26.7938    44.24\n",
       "2021-08-03  003001.SZ  27.8929   27.0754    44.70\n",
       "\n",
       "[200 rows x 4 columns]"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "stock_daily[['股票代码','市盈率(静态)', '市盈率(TTM)', '市盈率(动态)',]].head(200)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "0e9c0341",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['300431.SZ', '300029.SZ', '300665.SZ', '300446.SZ', '300478.SZ']"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "date0=stock_daily.date.unique()[::30][0]\n",
    "stock_daily[stock_daily[\"date\"]==date0].sort_values(by=\"总市值(万元)\").head(5)[\"股票代码\"].tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "c36912f2",
   "metadata": {},
   "outputs": [],
   "source": [
    "time_id=pd.Series(stock_daily.date.unique()).sort_values().tolist()[::30]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "id": "e89a224d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'2018-01-02'"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "str(time_id[0].date())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 158,
   "id": "4c7dc9d7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['300684.SZ', '300029.SZ', '300106.SZ', '300354.SZ', '300028.SZ']"
      ]
     },
     "execution_count": 158,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "stock_daily[stock_daily[\"date\"]==time_id[0]].sort_values(by=\"总市值(万元)\").head(5)[\"股票代码\"].tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "f69ce642",
   "metadata": {},
   "outputs": [],
   "source": [
    "stock_list=list(stock_list)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "id": "566c1225",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "44"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(stock_list)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "95801d64",
   "metadata": {},
   "source": [
    "### 市盈率\n",
    "\n",
    "https://baike.baidu.com/item/%E5%B8%82%E7%9B%88%E7%8E%87/90136?fr=aladdin\n",
    "\n",
    "市盈率亦称本益比，是股票价格除以每股盈利的比率。市场广泛谈及市盈率通常指的是静态市盈率，通常用来作为比较不同价格的股票是否被高估或者低估的指标。市盈率反映了在每股盈利不变的情况下，当派息率为100%，并且所得股息没有进行再投资的条件下，经过多少年投资可以通过股息全部收回。一般情况下，一只股票市盈率越低，市价相对于股票的盈利能力越低，表明投资回收期越短，投资风险就越小，股票的投资价值就越大；反之则结论相反。\n",
    "\n",
    "市盈率分为静态市盈率与动态市盈率。静态市盈率被广泛谈及也是人们通常所指，但更应关注与研究动态市盈率。市场广泛谈及的市盈率通常指的是静态市盈率，这给投资人的决策带来了许多盲点和误区。毕竟过去的并不能充分说明未来，而投资股票更多的是看未来！\n",
    "\n",
    "动态市盈率的计算公式是以静态市盈率为基数，乘以动态系数。该系数为1÷(1+i)n，其中i为企业每股收益的增长性比率，n为企业可持续发展的存续期。比如说，上市公司目前股价为20元，每股收益为0.38元，去年同期每股收益为0.28元，成长性i为35%，该企业未来保持该增长速度的时间n可持续5年，则动态系数为1÷(1+35%)5=22%。相应地，动态市盈率为11.6倍[即：52（静态市盈率：20元÷0.38元=52）×22%]。两者相比，差别之大，相信普通投资人看了会大吃一惊，恍然大悟。动态市盈率理论告诉一个简单朴素而又深刻的道理，即投资股市一定要选择有持续成长性的公司。因此不难理解资产重组为什么会成为市场永恒的主题，以及有些业绩不好的公司在实质性的重组题材支撑下成为市场黑马 。\n",
    "\n",
    "* ttm市盈率，静态市盈率和动态市盈率计算方法比较\n",
    "\n",
    "ttm市盈率是滚动市盈率，一般是指市盈率在一定的考察期内，即12个月，计算方法：市盈率＝普通股每股市场价格／普通股每年每股盈利。比如，某上市公司的普通每股市场价格为20，其普通股每年每股盈利0.5元，则其ttm市盈率＝20／0.5＝40。\n",
    "\n",
    "除了ttm市盈率之外，还存在静态市盈率和动态市盈率，其中静态市盈率一般指市场中所使用的市盈率，是指以股票的目前价格与当前每股预期收益之比，即静态市盈率＝股票现价／当前预期收益，体现的是企业按现在的盈利水平要多久才能回本，是衡量股票预期收益与风险的重要指标，一般是较低越好，但一些特殊情况下，静态市盈率较高也合理，这时需要投资者对比同行行业，企业发展阶段。\n",
    "\n",
    "动态市盈率是指股票现价与全年预估每股预期收益之比，即动态市盈率＝股票现价／全年预估每股预期收益，或者，动态市盈率＝静态市盈率／（1＋i）＾n其中i代表年增长率，n代表年份。动态市盈率反映公司的可持续发展能力。\n",
    "\n",
    "* 基于市盈率做因子策略"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "id": "d57fdb91",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['index', 'date', '股票代码', '股票简称', 'open', 'high', 'low', 'close',\n",
       "       'volume', '成交额(千元)', '换手率(%)', '量比', '市盈率(静态)', '市盈率(TTM)', '市盈率(动态)',\n",
       "       '市净率', '市销率', '市销率(TTM)', '股息率(%)', '股息率(TTM)(%)', '总股本(万股)',\n",
       "       '流通股本(万股)', '总市值(万元)', '流通市值(万元)', 'openinterest'],\n",
       "      dtype='object')"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "stock_daily.columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "id": "b312fed5",
   "metadata": {},
   "outputs": [],
   "source": [
    "time_30=pd.Series(stock_daily.date.unique()).sort_values().tolist()[::30]\n",
    "buy_date={}\n",
    "sell_date={}\n",
    "postion=set([])\n",
    "stock_list=set([])\n",
    "for i in time_30:\n",
    "    buy_list=stock_daily[stock_daily.date==i].sort_values(by=\"市盈率(静态)\",ascending=False).head(5)[\"股票代码\"].tolist()\n",
    "    buy_date.update({str(i.date()):buy_list})\n",
    "    sell_list=list(postion-set(buy_list))\n",
    "    sell_date.update({str(i.date()):sell_list})\n",
    "    postion=set(buy_list)\n",
    "    stock_list=stock_list|set(buy_list)\n",
    "stock_list=list(stock_list)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "id": "6921bb10",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "41"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(stock_list)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "id": "4b9d0950",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2018-01-02 2023-02-10\n",
      "初始资金: 100000.00\n",
      "2018-01-03, 买入300308.SZ, 成交量92，成交价194.85\n",
      "2018-01-03, 买入300280.SZ, 成交量495，成交价36.37\n",
      "2018-01-03, 买入300122.SZ, 成交量151，成交价118.93\n",
      "2018-01-03, 买入300404.SZ, 成交量434，成交价41.18\n",
      "2018-01-03, 买入300338.SZ, 成交量195，成交价92.17\n",
      "2018-02-14, 卖出300280.SZ, 成交量-495，成交价30.32\n",
      "2018-02-14, 卖出300308.SZ, 成交量-13，成交价200.60\n",
      "2018-02-14, 卖出300122.SZ, 成交量-6，成交价110.40\n",
      "2018-02-14, 买入300338.SZ, 成交量10，成交价77.16\n",
      "2018-02-14, 买入300404.SZ, 成交量142，成交价27.23\n",
      "2018-02-14, 买入300354.SZ, 成交量498，成交价31.57\n",
      "2018-04-04, 卖出300122.SZ, 成交量-145，成交价139.82\n",
      "2018-04-04, 买入300308.SZ, 成交量2，成交价250.95\n",
      "2018-04-04, 卖出300404.SZ, 成交量-121，成交价44.38\n",
      "2018-04-04, 买入300338.SZ, 成交量33，成交价82.86\n",
      "2018-04-04, 卖出300354.SZ, 成交量-19，成交价44.34\n",
      "2018-04-04, 买入300223.SZ, 成交量266，成交价74.33\n",
      "2018-05-22, 卖出300404.SZ, 成交量-455，成交价44.20\n",
      "2018-05-22, 卖出300308.SZ, 成交量-81，成交价248.31\n",
      "2018-05-22, 卖出300354.SZ, 成交量-479，成交价37.70\n",
      "2018-05-22, 卖出300338.SZ, 成交量-238，成交价84.62\n",
      "2018-05-22, 买入300268.SZ, 成交量539，成交价34.74\n",
      "2018-05-22, 买入300223.SZ, 成交量30，成交价65.36\n",
      "2018-05-22, 买入300337.SZ, 成交量697，成交价27.85\n",
      "2018-05-22, 买入300277.SZ, 成交量355，成交价54.49\n",
      "2018-05-22, 买入300211.SZ, 成交量457，成交价42.26\n",
      "2018-07-04, 卖出300277.SZ, 成交量-355，成交价41.45\n",
      "2018-07-04, 买入300280.SZ, 成交量561，成交价31.53\n",
      "2018-07-04, 卖出300337.SZ, 成交量-178，成交价34.51\n",
      "2018-07-04, 买入300268.SZ, 成交量83，成交价28.60\n",
      "2018-07-04, 卖出300223.SZ, 成交量-7，成交价60.85\n",
      "2018-07-04, 买入300211.SZ, 成交量57，成交价34.27\n",
      "2018-08-15, 卖出300211.SZ, 成交量-514，成交价34.78\n",
      "2018-08-15, 卖出300280.SZ, 成交量-39，成交价31.65\n",
      "2018-08-15, 卖出300223.SZ, 成交量-18，成交价61.06\n",
      "2018-08-15, 买入300268.SZ, 成交量50，成交价24.16\n",
      "2018-08-15, 买入300337.SZ, 成交量134，成交价25.36\n",
      "2018-08-15, 买入300413.SZ, 成交量409，成交价40.24\n",
      "2018-09-27, 卖出300413.SZ, 成交量-409，成交价35.39\n",
      "2018-09-27, 卖出300280.SZ, 成交量-51，成交价32.79\n",
      "2018-09-27, 卖出300268.SZ, 成交量-11，成交价23.31\n",
      "2018-09-27, 买入300337.SZ, 成交量67，成交价19.94\n",
      "2018-09-27, 买入300458.SZ, 成交量294，成交价52.05\n",
      "2018-11-15, 卖出300223.SZ, 成交量-271，成交价53.65\n",
      "2018-11-15, 卖出300458.SZ, 成交量-294，成交价42.46\n",
      "2018-11-15, 卖出300280.SZ, 成交量-33，成交价32.22\n",
      "2018-11-15, 买入300413.SZ, 成交量392，成交价35.91\n",
      "2018-11-15, 买入300337.SZ, 成交量42，成交价18.52\n",
      "2018-11-15, 买入300192.SZ, 成交量402，成交价35.19\n",
      "2018-12-27, 卖出300192.SZ, 成交量-402，成交价31.19\n",
      "2018-12-27, 卖出300337.SZ, 成交量-762，成交价15.81\n",
      "2018-12-27, 卖出300280.SZ, 成交量-19，成交价32.19\n",
      "2018-12-27, 卖出300268.SZ, 成交量-53，成交价22.72\n",
      "2018-12-27, 买入300223.SZ, 成交量272，成交价50.34\n",
      "2018-12-27, 卖出300413.SZ, 成交量-24，成交价37.31\n",
      "2018-12-27, 买入300211.SZ, 成交量430，成交价31.60\n",
      "2019-02-18, 买入300280.SZ, 成交量6，成交价34.31\n",
      "2019-02-18, 卖出300268.SZ, 成交量-61，成交价26.74\n",
      "2019-02-18, 卖出300223.SZ, 成交量-7，成交价55.58\n",
      "2019-02-18, 买入300413.SZ, 成交量21，成交价37.89\n",
      "2019-02-18, 买入300211.SZ, 成交量11，成交价33.00\n",
      "2019-04-01, 卖出300211.SZ, 成交量-441，成交价45.74\n",
      "2019-04-01, 买入300280.SZ, 成交量135，成交价31.17\n",
      "2019-04-01, 卖出300223.SZ, 成交量-38，成交价76.12\n",
      "2019-04-01, 买入300268.SZ, 成交量7，成交价31.24\n",
      "2019-04-01, 买入300483.SZ, 成交量491，成交价34.94\n",
      "2019-04-01, 卖出300413.SZ, 成交量-1，成交价44.87\n",
      "2019-05-17, 卖出300483.SZ, 成交量-491，成交价39.11\n",
      "2019-05-17, 卖出300413.SZ, 成交量-388，成交价43.51\n",
      "2019-05-17, 卖出300280.SZ, 成交量-560，成交价22.73\n",
      "2019-05-17, 卖出300223.SZ, 成交量-227，成交价70.70\n",
      "2019-05-17, 卖出300268.SZ, 成交量-554，成交价30.71\n",
      "2019-05-17, 买入300464.SZ, 成交量732，成交价22.46\n",
      "2019-05-17, 买入300548.SZ, 成交量467，成交价35.44\n",
      "2019-05-17, 买入300489.SZ, 成交量481，成交价34.06\n",
      "2019-05-17, 买入300236.SZ, 成交量294，成交价56.41\n",
      "2019-05-17, 买入300139.SZ, 成交量267，成交价63.27\n",
      "2019-07-01, 卖出300548.SZ, 成交量-35，成交价38.30\n",
      "2019-07-01, 买入300464.SZ, 成交量57，成交价20.62\n",
      "2019-07-01, 卖出300489.SZ, 成交量-22，成交价34.94\n",
      "2019-07-01, 卖出300236.SZ, 成交量-2，成交价55.74\n",
      "2019-07-01, 买入300139.SZ, 成交量9，成交价58.84\n",
      "2019-08-12, 卖出300139.SZ, 成交量-276，成交价47.27\n",
      "2019-08-12, 卖出300464.SZ, 成交量-36，成交价19.72\n",
      "2019-08-12, 卖出300489.SZ, 成交量-31，成交价33.86\n",
      "2019-08-12, 买入300548.SZ, 成交量49，成交价29.74\n",
      "2019-08-12, 卖出300236.SZ, 成交量-10，成交价52.05\n",
      "2019-08-12, 买入300483.SZ, 成交量379，成交价38.39\n",
      "2019-09-24, 卖出300483.SZ, 成交量-379，成交价40.48\n",
      "2019-09-24, 卖出300548.SZ, 成交量-121，成交价52.57\n",
      "2019-09-24, 卖出300464.SZ, 成交量-50，成交价26.81\n",
      "2019-09-24, 买入300489.SZ, 成交量64，成交价38.47\n",
      "2019-09-24, 卖出300236.SZ, 成交量-13，成交价70.47\n",
      "2019-09-24, 买入300552.SZ, 成交量330，成交价56.56\n",
      "2019-11-12, 卖出300464.SZ, 成交量-23，成交价28.07\n",
      "2019-11-12, 买入300548.SZ, 成交量9，成交价52.65\n",
      "2019-11-12, 卖出300552.SZ, 成交量-78，成交价75.93\n",
      "2019-11-12, 买入300489.SZ, 成交量61，成交价35.10\n",
      "2019-11-12, 买入300236.SZ, 成交量70，成交价56.62\n",
      "2019-12-24, 卖出300236.SZ, 成交量-339，成交价62.65\n",
      "2019-12-24, 卖出300548.SZ, 成交量-58，成交价73.75\n",
      "2019-12-24, 卖出300464.SZ, 成交量-44，成交价35.21\n",
      "2019-12-24, 买入300552.SZ, 成交量20，成交价82.00\n",
      "2019-12-24, 买入300489.SZ, 成交量30，成交价38.49\n",
      "2019-12-24, 买入300223.SZ, 成交量104，成交价218.08\n",
      "2020-02-13, 卖出300552.SZ, 成交量-272，成交价88.64\n",
      "2020-02-13, 卖出300548.SZ, 成交量-22，成交价89.32\n",
      "2020-02-13, 买入300464.SZ, 成交量67，成交价35.76\n",
      "2020-02-13, 买入300236.SZ, 成交量181，成交价148.65\n",
      "2020-02-13, 卖出300489.SZ, 成交量-35，成交价47.08\n",
      "2020-02-13, 卖出300223.SZ, 成交量-8，成交价272.19\n",
      "2020-03-26, 卖出300223.SZ, 成交量-96，成交价238.49\n",
      "2020-03-26, 买入300548.SZ, 成交量14，成交价88.05\n",
      "2020-03-26, 买入300236.SZ, 成交量12，成交价136.67\n",
      "2020-03-26, 卖出300489.SZ, 成交量-170，成交价74.22\n",
      "2020-03-26, 买入300464.SZ, 成交量91，成交价33.65\n",
      "2020-03-26, 买入300598.SZ, 成交量90，成交价290.44\n",
      "2020-05-13, 卖出300236.SZ, 成交量-193，成交价135.20\n",
      "2020-05-13, 卖出300464.SZ, 成交量-794，成交价26.41\n",
      "2020-05-13, 卖出300489.SZ, 成交量-378，成交价68.20\n",
      "2020-05-13, 卖出300598.SZ, 成交量-90，成交价261.28\n",
      "2020-05-13, 买入300085.SZ, 成交量165，成交价153.82\n",
      "2020-05-13, 买入300318.SZ, 成交量739，成交价33.83\n",
      "2020-05-13, 买入300101.SZ, 成交量280，成交价90.62\n",
      "2020-05-13, 卖出300548.SZ, 成交量-43，成交价100.92\n",
      "2020-05-13, 买入300618.SZ, 成交量211，成交价120.31\n",
      "2020-06-24, 买入300085.SZ, 成交量8，成交价157.66\n",
      "2020-06-24, 卖出300318.SZ, 成交量-11，成交价37.89\n",
      "2020-06-24, 买入300101.SZ, 成交量24，成交价90.29\n",
      "2020-06-24, 卖出300618.SZ, 成交量-20，成交价141.89\n",
      "2020-08-07, 卖出300548.SZ, 成交量-260，成交价108.35\n",
      "2020-08-07, 卖出300318.SZ, 成交量-253，成交价83.77\n",
      "2020-08-07, 卖出300085.SZ, 成交量-20，成交价266.35\n",
      "2020-08-07, 买入300101.SZ, 成交量3，成交价139.60\n",
      "2020-08-07, 买入300618.SZ, 成交量25，成交价187.23\n",
      "2020-08-07, 买入300083.SZ, 成交量454，成交价93.49\n",
      "2020-09-18, 卖出300083.SZ, 成交量-454，成交价85.84\n",
      "2020-09-18, 买入300318.SZ, 成交量61，成交价67.79\n",
      "2020-09-18, 卖出300101.SZ, 成交量-24，成交价130.87\n",
      "2020-09-18, 买入300618.SZ, 成交量16，成交价158.28\n",
      "2020-09-18, 买入300648.SZ, 成交量575，成交价64.05\n",
      "2020-11-09, 卖出300318.SZ, 成交量-126，成交价99.24\n",
      "2020-11-09, 买入300085.SZ, 成交量4，成交价256.91\n",
      "2020-11-09, 买入300101.SZ, 成交量18，成交价134.79\n",
      "2020-11-09, 买入300618.SZ, 成交量22，成交价158.35\n",
      "2020-11-09, 买入300648.SZ, 成交量52，成交价63.33\n",
      "2020-12-21, 买入300318.SZ, 成交量30，成交价92.47\n",
      "2020-12-21, 买入300085.SZ, 成交量35，成交价206.41\n",
      "2020-12-21, 买入300101.SZ, 成交量4，成交价129.15\n",
      "2020-12-21, 卖出300618.SZ, 成交量-27，成交价175.45\n",
      "2020-12-21, 卖出300648.SZ, 成交量-74，成交价72.10\n",
      "2021-02-02, 卖出300648.SZ, 成交量-553，成交价71.21\n",
      "2021-02-02, 买入300318.SZ, 成交量187，成交价62.12\n",
      "2021-02-02, 买入300085.SZ, 成交量31，成交价171.16\n",
      "2021-02-02, 卖出300618.SZ, 成交量-53，成交价217.64\n",
      "2021-02-02, 卖出300101.SZ, 成交量-23，成交价136.91\n",
      "2021-02-02, 买入300083.SZ, 成交量358，成交价106.99\n",
      "2021-03-23, 买入300318.SZ, 成交量23，成交价53.42\n",
      "2021-03-23, 卖出300085.SZ, 成交量-8，成交价161.39\n",
      "2021-03-23, 卖出300101.SZ, 成交量-11，成交价127.28\n",
      "2021-03-23, 卖出300083.SZ, 成交量-42，成交价109.38\n",
      "2021-03-23, 买入300618.SZ, 成交量49，成交价155.27\n",
      "2021-05-10, 卖出300085.SZ, 成交量-215，成交价168.64\n",
      "2021-05-10, 卖出300101.SZ, 成交量-271，成交价125.56\n",
      "2021-05-10, 卖出300083.SZ, 成交量-316，成交价92.09\n",
      "2021-05-10, 卖出300618.SZ, 成交量-223，成交价169.26\n",
      "2021-05-10, 买入300318.SZ, 成交量24，成交价51.42\n",
      "2021-05-10, 买入300700.SZ, 成交量2303，成交价14.69\n",
      "2021-05-10, 买入300492.SZ, 成交量257，成交价132.49\n",
      "2021-05-10, 买入300313.SZ, 成交量1864，成交价17.94\n",
      "2021-05-10, 买入300323.SZ, 成交量1110，成交价31.82\n",
      "2021-06-22, 卖出300492.SZ, 成交量-257，成交价90.87\n",
      "2021-06-22, 卖出300313.SZ, 成交量-1864，成交价14.29\n",
      "2021-06-22, 买入300534.SZ, 成交量1580，成交价21.29\n",
      "2021-06-22, 卖出300700.SZ, 成交量-384，成交价17.61\n",
      "2021-06-22, 卖出300318.SZ, 成交量-28，成交价52.13\n",
      "2021-06-22, 买入300077.SZ, 成交量413，成交价81.87\n",
      "2021-06-22, 卖出300323.SZ, 成交量-260，成交价39.37\n",
      "2021-08-03, 卖出300323.SZ, 成交量-850，成交价44.92\n",
      "2021-08-03, 卖出300077.SZ, 成交量-181，成交价200.81\n",
      "2021-08-03, 卖出300318.SZ, 成交量-15，成交价75.33\n",
      "2021-08-03, 买入300534.SZ, 成交量413，成交价23.58\n",
      "2021-08-03, 买入300223.SZ, 成交量104，成交价451.61\n",
      "2021-08-03, 买入300700.SZ, 成交量638，成交价18.62\n",
      "2021-09-14, 卖出300223.SZ, 成交量-104，成交价340.16\n",
      "2021-09-14, 买入300077.SZ, 成交量27，成交价162.91\n",
      "2021-09-14, 卖出300534.SZ, 成交量-258，成交价24.53\n",
      "2021-09-14, 买入300318.SZ, 成交量18，成交价64.44\n",
      "2021-09-14, 买入300536.SZ, 成交量533，成交价78.87\n",
      "2021-09-14, 卖出300700.SZ, 成交量-261，成交价18.66\n",
      "2021-11-04, 卖出300536.SZ, 成交量-533，成交价68.00\n",
      "2021-11-04, 买入300077.SZ, 成交量14，成交价134.80\n",
      "2021-11-04, 卖出300318.SZ, 成交量-17，成交价58.12\n",
      "2021-11-04, 买入300223.SZ, 成交量93，成交价391.66\n",
      "2021-11-04, 买入300534.SZ, 成交量183，成交价19.18\n",
      "2021-11-04, 卖出300700.SZ, 成交量-77，成交价16.40\n",
      "2021-12-16, 卖出300077.SZ, 成交量-7，成交价147.47\n",
      "2021-12-16, 卖出300318.SZ, 成交量-24，成交价62.51\n",
      "2021-12-16, 卖出300534.SZ, 成交量-118，成交价21.64\n",
      "2021-12-16, 卖出300700.SZ, 成交量-64，成交价18.31\n",
      "2021-12-16, 买入300223.SZ, 成交量14，成交价365.38\n",
      "2022-01-28, 卖出300534.SZ, 成交量-685，成交价36.70\n",
      "2022-01-28, 卖出300700.SZ, 成交量-430，成交价23.03\n",
      "2022-01-28, 买入300077.SZ, 成交量140，成交价103.60\n",
      "2022-01-28, 买入300318.SZ, 成交量216，成交价50.65\n",
      "2022-01-28, 买入300223.SZ, 成交量31，成交价298.06\n",
      "2022-03-18, 卖出300223.SZ, 成交量-138，成交价264.07\n",
      "2022-03-18, 卖出300534.SZ, 成交量-249，成交价48.70\n",
      "2022-03-18, 买入300700.SZ, 成交量49，成交价23.73\n",
      "2022-03-18, 买入300077.SZ, 成交量19，成交价99.38\n",
      "2022-03-18, 买入300318.SZ, 成交量30，成交价50.39\n",
      "2022-03-18, 买入300479.SZ, 成交量744，成交价54.90\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2022-05-06, 卖出300077.SZ, 成交量-425，成交价73.12\n",
      "2022-05-06, 卖出300318.SZ, 成交量-854，成交价38.79\n",
      "2022-05-06, 卖出300700.SZ, 成交量-1774，成交价23.07\n",
      "2022-05-06, 卖出300534.SZ, 成交量-866，成交价30.72\n",
      "2022-05-06, 卖出300479.SZ, 成交量-744，成交价35.45\n",
      "2022-05-06, 买入300353.SZ, 成交量714，成交价46.07\n",
      "2022-05-06, 买入300799.SZ, 成交量583，成交价55.88\n",
      "2022-05-06, 买入300446.SZ, 成交量811，成交价40.28\n",
      "2022-05-06, 买入300471.SZ, 成交量502，成交价65.23\n",
      "2022-05-06, 买入300937.SZ, 成交量1151，成交价28.41\n",
      "2022-06-20, 卖出300937.SZ, 成交量-1151，成交价29.99\n",
      "2022-06-20, 卖出300446.SZ, 成交量-811，成交价42.81\n",
      "2022-06-20, 卖出300799.SZ, 成交量-142，成交价92.23\n",
      "2022-06-20, 卖出300353.SZ, 成交量-22，成交价60.66\n",
      "2022-06-20, 买入300345.SZ, 成交量1484，成交价27.23\n",
      "2022-06-20, 卖出300471.SZ, 成交量-20，成交价85.12\n",
      "2022-06-20, 买入300105.SZ, 成交量1105，成交价36.86\n",
      "2022-08-01, 卖出300799.SZ, 成交量-15，成交价107.46\n",
      "2022-08-01, 买入300353.SZ, 成交量87，成交价57.85\n",
      "2022-08-01, 卖出300345.SZ, 成交量-160，成交价34.03\n",
      "2022-08-01, 卖出300105.SZ, 成交量-90，成交价43.41\n",
      "2022-08-01, 买入300471.SZ, 成交量43，成交价85.95\n",
      "2022-09-13, 卖出300471.SZ, 成交量-525，成交价79.74\n",
      "2022-09-13, 卖出300799.SZ, 成交量-6，成交价115.74\n",
      "2022-09-13, 卖出300353.SZ, 成交量-5，成交价62.69\n",
      "2022-09-13, 卖出300345.SZ, 成交量-112，成交价39.55\n",
      "2022-09-13, 买入300698.SZ, 成交量1934，成交价24.72\n",
      "2022-09-13, 卖出300105.SZ, 成交量-43，成交价50.72\n",
      "2022-11-01, 卖出300799.SZ, 成交量-110，成交价155.26\n",
      "2022-11-01, 买入300353.SZ, 成交量1，成交价61.51\n",
      "2022-11-01, 卖出300698.SZ, 成交量-28，成交价25.23\n",
      "2022-11-01, 买入300345.SZ, 成交量124，成交价35.37\n",
      "2022-11-01, 买入300105.SZ, 成交量361，成交价36.04\n",
      "2022-12-13, 卖出300799.SZ, 成交量-49，成交价216.45\n",
      "2022-12-13, 买入300353.SZ, 成交量91，成交价66.42\n",
      "2022-12-13, 卖出300345.SZ, 成交量-36，成交价43.51\n",
      "2022-12-13, 买入300698.SZ, 成交量436，成交价24.36\n",
      "2022-12-13, 卖出300105.SZ, 成交量-187，成交价49.77\n",
      "2023-02-01, 买入300799.SZ, 成交量107，成交价150.40\n",
      "2023-02-01, 卖出300345.SZ, 成交量-70，成交价45.58\n",
      "2023-02-01, 卖出300353.SZ, 成交量-71，成交价69.50\n",
      "2023-02-01, 卖出300698.SZ, 成交量-163，成交价25.34\n",
      "2023-02-01, 卖出300105.SZ, 成交量-61，成交价51.23\n",
      "最终资金: 334526.83\n",
      "夏普比率: OrderedDict([('sharperatio', 0.7190831969576289)])\n",
      "回撤指标: AutoOrderedDict([('len', 0), ('drawdown', 0.0), ('moneydown', 0.0), ('max', AutoOrderedDict([('len', 393), ('drawdown', 37.410539923507166), ('moneydown', 94567.22613900003)]))])\n"
     ]
    }
   ],
   "source": [
    "result=huice_run_num(start,end,stock_list,my_strategy_date_1)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b54201c5",
   "metadata": {},
   "source": [
    "## 多因子策略框架\n",
    "\n",
    "* 以\"总市值(万元)\"与'市盈率(静态)'两个因子分别排序，然后各自排序的顺序号相加，得到的和再次排序，以30天为周期选择排名前列的股票买入"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "id": "8a979219",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "300684.SZ      1\n",
       "300029.SZ      2\n",
       "300106.SZ      3\n",
       "300354.SZ      4\n",
       "300028.SZ      5\n",
       "            ... \n",
       "300059.SZ    659\n",
       "300072.SZ    660\n",
       "300433.SZ    661\n",
       "300676.SZ    662\n",
       "300498.SZ    663\n",
       "Length: 663, dtype: int64"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "foctor_sz=stock_daily[stock_daily[\"date\"]==time_30[0]].sort_values(by=\"总市值(万元)\")[\"股票代码\"].tolist()\n",
    "f_sz_df=pd.Series(range(1,len(foctor_sz)+1),index=foctor_sz)\n",
    "f_sz_df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "id": "cb7ec8ac",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "300308.SZ      1\n",
       "300280.SZ      2\n",
       "300122.SZ      3\n",
       "300404.SZ      4\n",
       "300338.SZ      5\n",
       "            ... \n",
       "300330.SZ    659\n",
       "300380.SZ    660\n",
       "300397.SZ    661\n",
       "300402.SZ    662\n",
       "300486.SZ    663\n",
       "Length: 663, dtype: int64"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "foctor_syl=stock_daily[stock_daily[\"date\"]==time_30[0]].sort_values(by=\"市盈率(静态)\",ascending=False)[\"股票代码\"].tolist()\n",
    "f_syl_df=pd.Series(range(1,len(foctor_syl)+1),index=foctor_syl)\n",
    "f_syl_df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "id": "f04491eb",
   "metadata": {},
   "outputs": [],
   "source": [
    "f_syl_sz=pd.concat([f_sz_df,f_syl_df],axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "id": "4f4a4bd8",
   "metadata": {},
   "outputs": [],
   "source": [
    "f_syl_sz[2]=f_syl_sz[0]+f_syl_sz[1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "id": "e4de9d46",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['300354.SZ', '300211.SZ', '300126.SZ', '300442.SZ', '300093.SZ']"
      ]
     },
     "execution_count": 80,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "f_syl_sz.sort_values(by=2).head(5).index.tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "id": "198f8854",
   "metadata": {},
   "outputs": [],
   "source": [
    "time_30=pd.Series(stock_daily.date.unique()).sort_values().tolist()[::30]\n",
    "buy_date={}\n",
    "sell_date={}\n",
    "postion=set([])\n",
    "stock_list=set([])\n",
    "for i in time_30:\n",
    "    foctor_sz=stock_daily[stock_daily[\"date\"]==i].sort_values(by=\"总市值(万元)\")[\"股票代码\"].tolist()\n",
    "    f_sz_df=pd.Series(range(1,len(foctor_sz)+1),index=foctor_sz)\n",
    "    foctor_syl=stock_daily[stock_daily[\"date\"]==i].sort_values(by=\"市盈率(静态)\",ascending=False)[\"股票代码\"].tolist()\n",
    "    f_syl_df=pd.Series(range(1,len(foctor_syl)+1),index=foctor_syl)\n",
    "    f_syl_sz=pd.concat([f_sz_df,f_syl_df],axis=1)\n",
    "    f_syl_sz[2]=f_syl_sz[0]+f_syl_sz[1]\n",
    "    \n",
    "    buy_list=f_syl_sz.sort_values(by=2).head(5).index.tolist()\n",
    "    buy_date.update({str(i.date()):buy_list})\n",
    "    sell_list=list(postion-set(buy_list))\n",
    "    sell_date.update({str(i.date()):sell_list})\n",
    "    postion=set(buy_list)\n",
    "    stock_list=stock_list|set(buy_list)\n",
    "    \n",
    "stock_list=list(stock_list)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "id": "d6cf1629",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "35"
      ]
     },
     "execution_count": 83,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(stock_list)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "id": "c13774cd",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2018-01-02 2023-02-10\n",
      "初始资金: 100000.00\n",
      "2018-01-03, 买入300354.SZ, 成交量443，成交价40.60\n",
      "2018-01-03, 买入300211.SZ, 成交量400，成交价45.04\n",
      "2018-01-03, 买入300126.SZ, 成交量677，成交价26.50\n",
      "2018-01-03, 买入300442.SZ, 成交量835，成交价21.67\n",
      "2018-01-03, 买入300093.SZ, 成交量871，成交价20.68\n",
      "2018-02-14, 卖出300211.SZ, 成交量-400，成交价38.53\n",
      "2018-02-14, 卖出300442.SZ, 成交量-835，成交价17.59\n",
      "2018-02-14, 买入300354.SZ, 成交量19，成交价31.57\n",
      "2018-02-14, 买入300220.SZ, 成交量331，成交价43.67\n",
      "2018-02-14, 买入300093.SZ, 成交量133，成交价14.65\n",
      "2018-02-14, 买入300404.SZ, 成交量535，成交价27.23\n",
      "2018-02-14, 卖出300126.SZ, 成交量-4，成交价21.53\n",
      "2018-04-04, 卖出300404.SZ, 成交量-535，成交价44.38\n",
      "2018-04-04, 卖出300220.SZ, 成交量-331，成交价52.17\n",
      "2018-04-04, 卖出300354.SZ, 成交量-27，成交价44.34\n",
      "2018-04-04, 买入300093.SZ, 成交量120，成交价16.09\n",
      "2018-04-04, 买入300092.SZ, 成交量940，成交价19.34\n",
      "2018-04-04, 买入300211.SZ, 成交量427，成交价42.51\n",
      "2018-04-04, 买入300126.SZ, 成交量74，成交价24.04\n",
      "2018-05-22, 卖出300093.SZ, 成交量-1124，成交价15.87\n",
      "2018-05-22, 买入300354.SZ, 成交量37，成交价37.70\n",
      "2018-05-22, 买入300126.SZ, 成交量25，成交价22.84\n",
      "2018-05-22, 买入300330.SZ, 成交量786，成交价22.84\n",
      "2018-05-22, 卖出300211.SZ, 成交量-6，成交价42.26\n",
      "2018-05-22, 卖出300092.SZ, 成交量-55，成交价20.01\n",
      "2018-07-04, 买入300354.SZ, 成交量2，成交价31.60\n",
      "2018-07-04, 买入300126.SZ, 成交量17，成交价19.02\n",
      "2018-07-04, 买入300211.SZ, 成交量13，成交价34.27\n",
      "2018-07-04, 买入300092.SZ, 成交量46，成交价16.05\n",
      "2018-07-04, 卖出300330.SZ, 成交量-25，成交价19.89\n",
      "2018-08-15, 卖出300211.SZ, 成交量-434，成交价34.78\n",
      "2018-08-15, 卖出300126.SZ, 成交量-789，成交价19.68\n",
      "2018-08-15, 买入300354.SZ, 成交量13，成交价30.51\n",
      "2018-08-15, 买入300330.SZ, 成交量50，成交价18.35\n",
      "2018-08-15, 买入300483.SZ, 成交量621，成交价23.92\n",
      "2018-08-15, 买入300268.SZ, 成交量607，成交价24.16\n",
      "2018-08-15, 卖出300092.SZ, 成交量-9，成交价16.05\n",
      "2018-09-27, 卖出300483.SZ, 成交量-621，成交价27.07\n",
      "2018-09-27, 卖出300092.SZ, 成交量-922，成交价19.67\n",
      "2018-09-27, 买入300354.SZ, 成交量33，成交价29.75\n",
      "2018-09-27, 买入300268.SZ, 成交量55，成交价23.31\n",
      "2018-09-27, 买入300126.SZ, 成交量835，成交价18.44\n",
      "2018-09-27, 买入300330.SZ, 成交量84，成交价17.31\n",
      "2018-09-27, 买入300211.SZ, 成交量472，成交价32.74\n",
      "2018-11-15, 卖出300126.SZ, 成交量-835，成交价20.99\n",
      "2018-11-15, 买入300268.SZ, 成交量63，成交价21.16\n",
      "2018-11-15, 买入300354.SZ, 成交量3，成交价29.23\n",
      "2018-11-15, 买入300330.SZ, 成交量11，成交价16.88\n",
      "2018-11-15, 买入300211.SZ, 成交量9，成交价31.85\n",
      "2018-11-15, 买入300442.SZ, 成交量1069，成交价14.51\n",
      "2018-12-27, 卖出300442.SZ, 成交量-1069，成交价13.25\n",
      "2018-12-27, 买入300354.SZ, 成交量31，成交价26.65\n",
      "2018-12-27, 买入300330.SZ, 成交量52，成交价15.43\n",
      "2018-12-27, 卖出300268.SZ, 成交量-66，成交价22.72\n",
      "2018-12-27, 卖出300211.SZ, 成交量-13，成交价31.60\n",
      "2018-12-27, 买入300092.SZ, 成交量941，成交价15.71\n",
      "2019-02-18, 卖出300268.SZ, 成交量-659，成交价26.74\n",
      "2019-02-18, 卖出300092.SZ, 成交量-941，成交价17.60\n",
      "2019-02-18, 买入300354.SZ, 成交量5，成交价28.40\n",
      "2019-02-18, 买入300330.SZ, 成交量67，成交价15.49\n",
      "2019-02-18, 买入300211.SZ, 成交量12，成交价33.00\n",
      "2019-02-18, 买入300442.SZ, 成交量1246，成交价12.80\n",
      "2019-02-18, 买入300126.SZ, 成交量817，成交价19.95\n",
      "2019-04-01, 卖出300211.SZ, 成交量-480，成交价45.74\n",
      "2019-04-01, 买入300354.SZ, 成交量2，成交价35.43\n",
      "2019-04-01, 卖出300330.SZ, 成交量-57，成交价20.46\n",
      "2019-04-01, 买入300442.SZ, 成交量75，成交价15.01\n",
      "2019-04-01, 买入300235.SZ, 成交量522，成交价37.77\n",
      "2019-04-01, 卖出300126.SZ, 成交量-20，成交价24.94\n",
      "2019-05-17, 卖出300354.SZ, 成交量-561，成交价36.58\n",
      "2019-05-17, 卖出300442.SZ, 成交量-1321，成交价14.30\n",
      "2019-05-17, 卖出300235.SZ, 成交量-522，成交价35.85\n",
      "2019-05-17, 卖出300330.SZ, 成交量-968，成交价18.85\n",
      "2019-05-17, 卖出300126.SZ, 成交量-797，成交价23.35\n",
      "2019-05-17, 买入300489.SZ, 成交量550，成交价34.06\n",
      "2019-05-17, 买入300680.SZ, 成交量971，成交价19.50\n",
      "2019-05-17, 买入300254.SZ, 成交量1518，成交价12.38\n",
      "2019-05-17, 买入300092.SZ, 成交量946，成交价19.83\n",
      "2019-05-17, 买入300211.SZ, 成交量473，成交价43.43\n",
      "2019-07-01, 卖出300211.SZ, 成交量-473，成交价43.75\n",
      "2019-07-01, 卖出300680.SZ, 成交量-52，成交价20.10\n",
      "2019-07-01, 买入300254.SZ, 成交量99，成交价11.88\n",
      "2019-07-01, 买入300092.SZ, 成交量35，成交价19.65\n",
      "2019-07-01, 买入300141.SZ, 成交量564，成交价33.95\n",
      "2019-08-12, 买入300680.SZ, 成交量17，成交价18.63\n",
      "2019-08-12, 卖出300489.SZ, 成交量-35，成交价33.86\n",
      "2019-08-12, 买入300092.SZ, 成交量54，成交价16.94\n",
      "2019-08-12, 卖出300254.SZ, 成交量-46，成交价11.10\n",
      "2019-08-12, 买入300141.SZ, 成交量41，成交价28.69\n",
      "2019-09-24, 卖出300680.SZ, 成交量-21，成交价21.19\n",
      "2019-09-24, 卖出300489.SZ, 成交量-16，成交价38.47\n",
      "2019-09-24, 买入300092.SZ, 成交量13，成交价18.45\n",
      "2019-09-24, 卖出300254.SZ, 成交量-6，成交价12.36\n",
      "2019-09-24, 卖出300141.SZ, 成交量-3，成交价31.93\n",
      "2019-11-12, 卖出300680.SZ, 成交量-1，成交价19.65\n",
      "2019-11-12, 买入300489.SZ, 成交量15，成交价35.10\n",
      "2019-11-12, 卖出300092.SZ, 成交量-12，成交价17.55\n",
      "2019-11-12, 买入300254.SZ, 成交量17，成交价11.40\n",
      "2019-11-12, 买入300141.SZ, 成交量5，成交价29.63\n",
      "2019-12-24, 卖出300680.SZ, 成交量-52，成交价21.96\n",
      "2019-12-24, 卖出300489.SZ, 成交量-21，成交价38.49\n",
      "2019-12-24, 买入300141.SZ, 成交量33，成交价29.58\n",
      "2019-12-24, 买入300254.SZ, 成交量35，成交价11.67\n",
      "2019-12-24, 买入300092.SZ, 成交量5，成交价18.14\n",
      "2020-02-13, 卖出300254.SZ, 成交量-1617，成交价13.31\n",
      "2020-02-13, 买入300680.SZ, 成交量102，成交价20.42\n",
      "2020-02-13, 买入300092.SZ, 成交量131，成交价16.81\n",
      "2020-02-13, 买入300141.SZ, 成交量13，成交价29.96\n",
      "2020-02-13, 买入300539.SZ, 成交量1322，成交价14.90\n",
      "2020-02-13, 卖出300489.SZ, 成交量-70，成交价47.08\n",
      "2020-03-26, 卖出300141.SZ, 成交量-653，成交价53.91\n",
      "2020-03-26, 卖出300539.SZ, 成交量-1322，成交价15.57\n",
      "2020-03-26, 卖出300489.SZ, 成交量-423，成交价74.22\n",
      "2020-03-26, 买入300254.SZ, 成交量2169，成交价11.67\n",
      "2020-03-26, 买入300680.SZ, 成交量27，成交价27.20\n",
      "2020-03-26, 买入300721.SZ, 成交量1149，成交价21.80\n",
      "2020-03-26, 买入300092.SZ, 成交量124，成交价19.55\n",
      "2020-03-26, 买入300022.SZ, 成交量1583，成交价16.09\n",
      "2020-05-13, 卖出300680.SZ, 成交量-991，成交价24.62\n",
      "2020-05-13, 卖出300022.SZ, 成交量-1583，成交价21.81\n",
      "2020-05-13, 卖出300092.SZ, 成交量-1296，成交价18.22\n",
      "2020-05-13, 买入300254.SZ, 成交量381，成交价9.99\n",
      "2020-05-13, 买入300330.SZ, 成交量1342，成交价19.05\n",
      "2020-05-13, 买入300153.SZ, 成交量1146，成交价22.26\n",
      "2020-05-13, 买入300721.SZ, 成交量229，成交价18.29\n",
      "2020-05-13, 买入300312.SZ, 成交量1616，成交价15.71\n",
      "2020-06-24, 卖出300330.SZ, 成交量-1342，成交价22.60\n",
      "2020-06-24, 买入300254.SZ, 成交量62，成交价10.16\n",
      "2020-06-24, 买入300312.SZ, 成交量531，成交价12.22\n",
      "2020-06-24, 买入300153.SZ, 成交量33，成交价22.44\n",
      "2020-06-24, 买入300555.SZ, 成交量1261，成交价21.02\n",
      "2020-06-24, 卖出300721.SZ, 成交量-121，成交价21.13\n",
      "2020-08-07, 卖出300721.SZ, 成交量-1257，成交价24.59\n",
      "2020-08-07, 买入300153.SZ, 成交量57，成交价24.48\n",
      "2020-08-07, 卖出300312.SZ, 成交量-154，成交价15.01\n",
      "2020-08-07, 卖出300254.SZ, 成交量-87，成交价11.68\n",
      "2020-08-07, 买入300555.SZ, 成交量33，成交价23.29\n",
      "2020-08-07, 买入300330.SZ, 成交量1156，成交价26.05\n",
      "2020-09-18, 卖出300153.SZ, 成交量-71，成交价29.50\n",
      "2020-09-18, 买入300254.SZ, 成交量127，成交价13.16\n",
      "2020-09-18, 买入300555.SZ, 成交量70，成交价25.53\n",
      "2020-09-18, 买入300330.SZ, 成交量112，成交价27.41\n",
      "2020-09-18, 卖出300312.SZ, 成交量-337，成交价20.56\n",
      "2020-11-09, 卖出300312.SZ, 成交量-1656，成交价26.53\n",
      "2020-11-09, 卖出300153.SZ, 成交量-1165，成交价46.77\n",
      "2020-11-09, 买入300330.SZ, 成交量284，成交价26.65\n",
      "2020-11-09, 买入300254.SZ, 成交量484，成交价12.94\n",
      "2020-11-09, 买入300555.SZ, 成交量16，成交价29.87\n",
      "2020-11-09, 买入300721.SZ, 成交量1341，成交价30.47\n",
      "2020-11-09, 买入300592.SZ, 成交量2106，成交价19.15\n",
      "2020-12-21, 卖出300721.SZ, 成交量-1341，成交价32.00\n",
      "2020-12-21, 卖出300592.SZ, 成交量-2106，成交价17.92\n",
      "2020-12-21, 买入300330.SZ, 成交量105，成交价22.23\n",
      "2020-12-21, 买入300254.SZ, 成交量367，成交价10.49\n",
      "2020-12-21, 买入300312.SZ, 成交量2073，成交价18.07\n",
      "2020-12-21, 买入300555.SZ, 成交量86，成交价25.15\n",
      "2020-12-21, 买入300211.SZ, 成交量844，成交价41.98\n",
      "2021-02-02, 卖出300211.SZ, 成交量-844，成交价55.79\n",
      "2021-02-02, 买入300555.SZ, 成交量220，成交价18.70\n",
      "2021-02-02, 买入300330.SZ, 成交量88，成交价17.86\n",
      "2021-02-02, 买入300153.SZ, 成交量1411，成交价22.12\n",
      "2021-02-02, 买入300254.SZ, 成交量472，成交价7.96\n",
      "2021-02-02, 买入300312.SZ, 成交量973，成交价10.37\n",
      "2021-03-23, 买入300153.SZ, 成交量138，成交价25.26\n",
      "2021-03-23, 买入300254.SZ, 成交量289，成交价8.98\n",
      "2021-03-23, 买入300330.SZ, 成交量224，成交价19.46\n",
      "2021-03-23, 买入300555.SZ, 成交量148，成交价20.92\n",
      "2021-03-23, 卖出300312.SZ, 成交量-969，成交价18.40\n",
      "2021-05-10, 卖出300312.SZ, 成交量-2077，成交价9.40\n",
      "2021-05-10, 卖出300254.SZ, 成交量-4264，成交价10.22\n",
      "2021-05-10, 卖出300153.SZ, 成交量-1549，成交价28.76\n",
      "2021-05-10, 买入300700.SZ, 成交量2492，成交价14.69\n",
      "2021-05-10, 买入300807.SZ, 成交量1565，成交价23.41\n",
      "2021-05-10, 卖出300330.SZ, 成交量-7，成交价18.77\n",
      "2021-05-10, 卖出300555.SZ, 成交量-94，成交价22.25\n",
      "2021-05-10, 买入300345.SZ, 成交量2273，成交价16.46\n",
      "2021-06-22, 卖出300345.SZ, 成交量-2273，成交价24.56\n",
      "2021-06-22, 买入300700.SZ, 成交量88，成交价17.61\n",
      "2021-06-22, 买入300534.SZ, 成交量2126，成交价21.29\n",
      "2021-06-22, 买入300807.SZ, 成交量76，成交价27.65\n",
      "2021-06-22, 买入300555.SZ, 成交量77，成交价24.93\n",
      "2021-06-22, 卖出300330.SZ, 成交量-18，成交价23.14\n",
      "2021-08-03, 卖出300330.SZ, 成交量-1944，成交价23.06\n",
      "2021-08-03, 卖出300700.SZ, 成交量-96，成交价18.62\n",
      "2021-08-03, 买入300807.SZ, 成交量114，成交价26.06\n",
      "2021-08-03, 买入300555.SZ, 成交量76，成交价24.52\n",
      "2021-08-03, 卖出300534.SZ, 成交量-190，成交价23.58\n",
      "2021-08-03, 买入300313.SZ, 成交量3675，成交价12.47\n",
      "2021-09-14, 卖出300313.SZ, 成交量-3675，成交价20.53\n",
      "2021-09-14, 买入300700.SZ, 成交量219，成交价18.66\n",
      "2021-09-14, 买入300807.SZ, 成交量281，成交价24.51\n",
      "2021-09-14, 买入300555.SZ, 成交量354，成交价22.28\n",
      "2021-09-14, 买入300534.SZ, 成交量107，成交价24.53\n",
      "2021-09-14, 买入300330.SZ, 成交量2238，成交价22.56\n",
      "2021-11-04, 卖出300700.SZ, 成交量-19，成交价16.40\n",
      "2021-11-04, 卖出300807.SZ, 成交量-77，成交价22.80\n",
      "2021-11-04, 买入300534.SZ, 成交量277，成交价19.18\n",
      "2021-11-04, 买入300330.SZ, 成交量31，成交价19.44\n",
      "2021-12-16, 买入300700.SZ, 成交量153，成交价18.31\n",
      "2021-12-16, 买入300534.SZ, 成交量50，成交价21.64\n",
      "2021-12-16, 卖出300555.SZ, 成交量-3，成交价22.98\n",
      "2021-12-16, 买入300330.SZ, 成交量238，成交价20.50\n",
      "2021-12-16, 卖出300807.SZ, 成交量-386，成交价32.41\n",
      "2022-01-28, 卖出300534.SZ, 成交量-2370，成交价36.70\n",
      "2022-01-28, 买入300807.SZ, 成交量838，成交价23.81\n",
      "2022-01-28, 买入300555.SZ, 成交量514，成交价20.87\n",
      "2022-01-28, 买入300330.SZ, 成交量421，成交价19.68\n",
      "2022-01-28, 卖出300700.SZ, 成交量-457，成交价23.03\n",
      "2022-01-28, 买入300313.SZ, 成交量4465，成交价12.81\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2022-03-18, 卖出300330.SZ, 成交量-2928，成交价26.09\n",
      "2022-03-18, 买入300555.SZ, 成交量294，成交价20.56\n",
      "2022-03-18, 买入300313.SZ, 成交量527，成交价12.71\n",
      "2022-03-18, 卖出300807.SZ, 成交量-346，成交价29.83\n",
      "2022-03-18, 买入300700.SZ, 成交量240，成交价23.73\n",
      "2022-03-18, 买入300615.SZ, 成交量2439，成交价25.74\n",
      "2022-05-06, 卖出300807.SZ, 成交量-2065，成交价19.14\n",
      "2022-05-06, 卖出300700.SZ, 成交量-2620，成交价23.07\n",
      "2022-05-06, 卖出300313.SZ, 成交量-4992，成交价10.03\n",
      "2022-05-06, 卖出300555.SZ, 成交量-3052，成交价17.66\n",
      "2022-05-06, 卖出300615.SZ, 成交量-2439，成交价22.31\n",
      "2022-05-06, 买入300321.SZ, 成交量1698，成交价30.47\n",
      "2022-05-06, 买入300594.SZ, 成交量3653，成交价14.33\n",
      "2022-05-06, 买入300736.SZ, 成交量2427，成交价22.00\n",
      "2022-05-06, 买入300521.SZ, 成交量2710，成交价19.07\n",
      "2022-05-06, 买入300637.SZ, 成交量4115，成交价12.79\n",
      "2022-06-20, 卖出300321.SZ, 成交量-20，成交价34.85\n",
      "2022-06-20, 卖出300594.SZ, 成交量-174，成交价16.72\n",
      "2022-06-20, 买入300521.SZ, 成交量178，成交价19.85\n",
      "2022-06-20, 卖出300736.SZ, 成交量-35，成交价23.97\n",
      "2022-06-20, 卖出300637.SZ, 成交量-54，成交价14.12\n",
      "2022-08-01, 买入300321.SZ, 成交量54，成交价36.73\n",
      "2022-08-01, 卖出300594.SZ, 成交量-147，成交价18.78\n",
      "2022-08-01, 买入300736.SZ, 成交量87，成交价25.38\n",
      "2022-08-01, 卖出300521.SZ, 成交量-146，成交价23.63\n",
      "2022-08-01, 卖出300637.SZ, 成交量-67，成交价15.78\n",
      "2022-09-13, 卖出300321.SZ, 成交量-41，成交价36.67\n",
      "2022-09-13, 买入300594.SZ, 成交量319，成交价16.92\n",
      "2022-09-13, 买入300521.SZ, 成交量269，成交价20.56\n",
      "2022-09-13, 卖出300736.SZ, 成交量-337，成交价28.70\n",
      "2022-09-13, 买入300637.SZ, 成交量68，成交价15.13\n",
      "2022-11-01, 买入300321.SZ, 成交量96，成交价32.47\n",
      "2022-11-01, 买入300594.SZ, 成交量21，成交价15.75\n",
      "2022-11-01, 卖出300521.SZ, 成交量-35，成交价19.45\n",
      "2022-11-01, 卖出300736.SZ, 成交量-78，成交价28.29\n",
      "2022-11-01, 买入300637.SZ, 成交量99，成交价13.90\n",
      "2022-12-13, 卖出300736.SZ, 成交量-2064，成交价37.85\n",
      "2022-12-13, 买入300321.SZ, 成交量103，成交价34.74\n",
      "2022-12-13, 买入300521.SZ, 成交量493，成交价18.90\n",
      "2022-12-13, 买入300637.SZ, 成交量452，成交价14.32\n",
      "2022-12-13, 卖出300594.SZ, 成交量-575，成交价20.85\n",
      "2022-12-13, 买入300126.SZ, 成交量2902，成交价22.52\n",
      "2023-02-01, 卖出300126.SZ, 成交量-2902，成交价24.07\n",
      "2023-02-01, 买入300321.SZ, 成交量90，成交价35.42\n",
      "2023-02-01, 买入300637.SZ, 成交量344，成交价14.02\n",
      "2023-02-01, 卖出300521.SZ, 成交量-517，成交价23.74\n",
      "2023-02-01, 买入300594.SZ, 成交量107，成交价21.84\n",
      "2023-02-01, 买入300405.SZ, 成交量3229，成交价21.64\n",
      "最终资金: 412385.29\n",
      "夏普比率: OrderedDict([('sharperatio', 0.8483978214103814)])\n",
      "回撤指标: AutoOrderedDict([('len', 0), ('drawdown', 0.0), ('moneydown', 0.0), ('max', AutoOrderedDict([('len', 219), ('drawdown', 34.53634955356987), ('moneydown', 114379.93759880005)]))])\n"
     ]
    }
   ],
   "source": [
    "result=huice_run_num(start,end,stock_list,my_strategy_date_1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "id": "29ea0e62",
   "metadata": {},
   "outputs": [],
   "source": [
    "factor1_stock=stock_daily[stock_daily[\"date\"]==time_id[0]].sort_values(by=\"总市值(万元)\")[\"股票代码\"].tolist()\n",
    "factor2_stock=stock_daily[stock_daily[\"date\"]==time_id[0]].sort_values(by='市盈率(静态)',ascending=False)[\"股票代码\"].tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "id": "3e298eb6",
   "metadata": {},
   "outputs": [],
   "source": [
    "f_1_df=pd.Series(range(1,len(factor1_stock)+1),index=factor1_stock)\n",
    "f_2_df=pd.Series(range(1,len(factor2_stock)+1),index=factor2_stock)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "id": "88b706a1",
   "metadata": {},
   "outputs": [],
   "source": [
    "f_1_2=pd.concat([f_1_df,f_2_df],axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "id": "96d89d20",
   "metadata": {},
   "outputs": [],
   "source": [
    "f_1_2[2]=f_1_2[0]+f_1_2[1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "id": "adc02b46",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['300354.SZ', '300211.SZ', '300126.SZ', '300442.SZ', '300093.SZ']"
      ]
     },
     "execution_count": 80,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "f_1_2.sort_values(by=2).head(5).index.tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "id": "f835cbd5",
   "metadata": {},
   "outputs": [],
   "source": [
    "#stock_list"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fad7cb28",
   "metadata": {},
   "source": [
    "## 获取策略实时资产价值并作图\n",
    "\n",
    "* self.broker.getvalue() 用来获取实时资产价值\n",
    "* order.data._name 获取当前订单股票ID\n",
    "* ak.index_zh_a_hist 获取指数历史数据的方法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "id": "fbb0f299",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              日期       开盘       收盘       最高       最低        成交量           成交额  \\\n",
      "0     2018-02-22  4020.97  4052.73  4058.79  4009.92  105811571  1.383344e+11   \n",
      "1     2018-02-23  4061.75  4071.09  4085.20  4035.23   99458747  1.281958e+11   \n",
      "2     2018-02-26  4093.40  4118.42  4128.74  4048.98  137881001  1.790131e+11   \n",
      "3     2018-02-27  4120.87  4058.98  4120.87  4051.81  125934469  1.696849e+11   \n",
      "4     2018-02-28  4016.79  4023.64  4051.71  3991.71  109343593  1.524939e+11   \n",
      "...          ...      ...      ...      ...      ...        ...           ...   \n",
      "1202  2023-02-06  4103.83  4086.88  4105.94  4065.22  110192717  2.263451e+11   \n",
      "1203  2023-02-07  4098.31  4094.23  4107.34  4077.96   91360072  1.835374e+11   \n",
      "1204  2023-02-08  4099.86  4076.14  4111.47  4072.65   84786099  1.705918e+11   \n",
      "1205  2023-02-09  4067.56  4130.86  4130.86  4064.75  102289961  2.117226e+11   \n",
      "1206  2023-02-10  4124.10  4106.31  4125.29  4092.35   96716733  1.953483e+11   \n",
      "\n",
      "        振幅   涨跌幅    涨跌额   换手率  \n",
      "0     1.23  2.16  85.77  0.36  \n",
      "1     1.23  0.45  18.36  0.34  \n",
      "2     1.96  1.16  47.33  0.47  \n",
      "3     1.68 -1.44 -59.44  0.43  \n",
      "4     1.48 -0.87 -35.34  0.37  \n",
      "...    ...   ...    ...   ...  \n",
      "1202  0.98 -1.32 -54.75  0.38  \n",
      "1203  0.72  0.18   7.35  0.31  \n",
      "1204  0.95 -0.44 -18.09  0.29  \n",
      "1205  1.62  1.34  54.72  0.35  \n",
      "1206  0.80 -0.59 -24.55  0.33  \n",
      "\n",
      "[1207 rows x 11 columns]\n"
     ]
    }
   ],
   "source": [
    "#沪深300\n",
    "index_zh_a_hist_df = ak.index_zh_a_hist(symbol=\"000300\", period=\"daily\", start_date=\"20180222\", end_date=\"20230210\")\n",
    "print(index_zh_a_hist_df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "id": "8b839ea7",
   "metadata": {},
   "outputs": [],
   "source": [
    "index_zh_a_hist_df.set_index(\"日期\",inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "id": "58a55871",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:xlabel='日期'>"
      ]
     },
     "execution_count": 89,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "index_zh_a_hist_df[\"收盘\"].plot()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "id": "37d2be5f",
   "metadata": {},
   "outputs": [],
   "source": [
    "class my_strategy_date_2(bt.Strategy):\n",
    "    #全局设定交易策略的参数\n",
    "\n",
    "    def __init__(self):\n",
    "        # 初始化交易指令、买卖价格和手续费\n",
    "        self.order = None\n",
    "\n",
    "    def next(self):\n",
    "        # 检查是否持仓 \n",
    "        #print(str(self.datetime.date(0)))\n",
    "        cash_value.update({str(self.datetime.date(0)):self.broker.getvalue()})\n",
    "        if str(self.datetime.date(0)) in sell_date.keys(): \n",
    "            s_list=sell_date[str(self.datetime.date(0))]\n",
    "            for i in s_list:\n",
    "                self.order_target_percent(target=0,data=i)\n",
    "        if str(self.datetime.date(0)) in buy_date.keys(): \n",
    "            s_list=buy_date[str(self.datetime.date(0))]\n",
    "            for i in s_list:\n",
    "                self.order_target_percent(target=0.9/len(s_list),data=i)\n",
    "                \n",
    "\n",
    "            \n",
    "    def log(self, txt, dt=None):\n",
    "        ''' 输出日志'''\n",
    "        dt = dt or self.datas[0].datetime.date(0) # 拿现在的日期\n",
    "        print('%s, %s' % (dt.isoformat(), txt))\n",
    "\n",
    "    def notify_order(self, order):\n",
    "        if order.status in [order.Submitted, order.Accepted]:\n",
    "            # Buy/Sell order submitted/accepted to/by broker - Nothing to do\n",
    "            return\n",
    "\n",
    "        # Check if an order has been completed\n",
    "        # Attention: broker could reject order if not enough cash\n",
    "        if order.status in [order.Completed, order.Canceled, order.Margin]:\n",
    "            if order.isbuy():\n",
    "                self.log(f\"\"\"买入{order.data._name}, 成交量{order.executed.size}，成交价{order.executed.price:.2f}\"\"\")\n",
    "            elif order.issell():\n",
    "                self.log(f\"\"\"卖出{order.data._name}, 成交量{order.executed.size}，成交价{order.executed.price:.2f}\"\"\")\n",
    "            self.bar_executed = len(self)\n",
    "\n",
    "        # Write down: no pending order\n",
    "        self.order = None"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "id": "a20c3c2a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2018-01-02 2023-02-10\n",
      "初始资金: 100000.00\n",
      "2018-01-03, 买入300354.SZ, 成交量443，成交价40.60\n",
      "2018-01-03, 买入300211.SZ, 成交量400，成交价45.04\n",
      "2018-01-03, 买入300126.SZ, 成交量677，成交价26.50\n",
      "2018-01-03, 买入300442.SZ, 成交量835，成交价21.67\n",
      "2018-01-03, 买入300093.SZ, 成交量871，成交价20.68\n",
      "2018-02-14, 卖出300211.SZ, 成交量-400，成交价38.53\n",
      "2018-02-14, 卖出300442.SZ, 成交量-835，成交价17.59\n",
      "2018-02-14, 买入300354.SZ, 成交量19，成交价31.57\n",
      "2018-02-14, 买入300220.SZ, 成交量331，成交价43.67\n",
      "2018-02-14, 买入300093.SZ, 成交量133，成交价14.65\n",
      "2018-02-14, 买入300404.SZ, 成交量535，成交价27.23\n",
      "2018-02-14, 卖出300126.SZ, 成交量-4，成交价21.53\n",
      "2018-04-04, 卖出300404.SZ, 成交量-535，成交价44.38\n",
      "2018-04-04, 卖出300220.SZ, 成交量-331，成交价52.17\n",
      "2018-04-04, 卖出300354.SZ, 成交量-27，成交价44.34\n",
      "2018-04-04, 买入300093.SZ, 成交量120，成交价16.09\n",
      "2018-04-04, 买入300092.SZ, 成交量940，成交价19.34\n",
      "2018-04-04, 买入300211.SZ, 成交量427，成交价42.51\n",
      "2018-04-04, 买入300126.SZ, 成交量74，成交价24.04\n",
      "2018-05-22, 卖出300093.SZ, 成交量-1124，成交价15.87\n",
      "2018-05-22, 买入300354.SZ, 成交量37，成交价37.70\n",
      "2018-05-22, 买入300126.SZ, 成交量25，成交价22.84\n",
      "2018-05-22, 买入300330.SZ, 成交量786，成交价22.84\n",
      "2018-05-22, 卖出300211.SZ, 成交量-6，成交价42.26\n",
      "2018-05-22, 卖出300092.SZ, 成交量-55，成交价20.01\n",
      "2018-07-04, 买入300354.SZ, 成交量2，成交价31.60\n",
      "2018-07-04, 买入300126.SZ, 成交量17，成交价19.02\n",
      "2018-07-04, 买入300211.SZ, 成交量13，成交价34.27\n",
      "2018-07-04, 买入300092.SZ, 成交量46，成交价16.05\n",
      "2018-07-04, 卖出300330.SZ, 成交量-25，成交价19.89\n",
      "2018-08-15, 卖出300211.SZ, 成交量-434，成交价34.78\n",
      "2018-08-15, 卖出300126.SZ, 成交量-789，成交价19.68\n",
      "2018-08-15, 买入300354.SZ, 成交量13，成交价30.51\n",
      "2018-08-15, 买入300330.SZ, 成交量50，成交价18.35\n",
      "2018-08-15, 买入300483.SZ, 成交量621，成交价23.92\n",
      "2018-08-15, 买入300268.SZ, 成交量607，成交价24.16\n",
      "2018-08-15, 卖出300092.SZ, 成交量-9，成交价16.05\n",
      "2018-09-27, 卖出300483.SZ, 成交量-621，成交价27.07\n",
      "2018-09-27, 卖出300092.SZ, 成交量-922，成交价19.67\n",
      "2018-09-27, 买入300354.SZ, 成交量33，成交价29.75\n",
      "2018-09-27, 买入300268.SZ, 成交量55，成交价23.31\n",
      "2018-09-27, 买入300126.SZ, 成交量835，成交价18.44\n",
      "2018-09-27, 买入300330.SZ, 成交量84，成交价17.31\n",
      "2018-09-27, 买入300211.SZ, 成交量472，成交价32.74\n",
      "2018-11-15, 卖出300126.SZ, 成交量-835，成交价20.99\n",
      "2018-11-15, 买入300268.SZ, 成交量63，成交价21.16\n",
      "2018-11-15, 买入300354.SZ, 成交量3，成交价29.23\n",
      "2018-11-15, 买入300330.SZ, 成交量11，成交价16.88\n",
      "2018-11-15, 买入300211.SZ, 成交量9，成交价31.85\n",
      "2018-11-15, 买入300442.SZ, 成交量1069，成交价14.51\n",
      "2018-12-27, 卖出300442.SZ, 成交量-1069，成交价13.25\n",
      "2018-12-27, 买入300354.SZ, 成交量31，成交价26.65\n",
      "2018-12-27, 买入300330.SZ, 成交量52，成交价15.43\n",
      "2018-12-27, 卖出300268.SZ, 成交量-66，成交价22.72\n",
      "2018-12-27, 卖出300211.SZ, 成交量-13，成交价31.60\n",
      "2018-12-27, 买入300092.SZ, 成交量941，成交价15.71\n",
      "2019-02-18, 卖出300268.SZ, 成交量-659，成交价26.74\n",
      "2019-02-18, 卖出300092.SZ, 成交量-941，成交价17.60\n",
      "2019-02-18, 买入300354.SZ, 成交量5，成交价28.40\n",
      "2019-02-18, 买入300330.SZ, 成交量67，成交价15.49\n",
      "2019-02-18, 买入300211.SZ, 成交量12，成交价33.00\n",
      "2019-02-18, 买入300442.SZ, 成交量1246，成交价12.80\n",
      "2019-02-18, 买入300126.SZ, 成交量817，成交价19.95\n",
      "2019-04-01, 卖出300211.SZ, 成交量-480，成交价45.74\n",
      "2019-04-01, 买入300354.SZ, 成交量2，成交价35.43\n",
      "2019-04-01, 卖出300330.SZ, 成交量-57，成交价20.46\n",
      "2019-04-01, 买入300442.SZ, 成交量75，成交价15.01\n",
      "2019-04-01, 买入300235.SZ, 成交量522，成交价37.77\n",
      "2019-04-01, 卖出300126.SZ, 成交量-20，成交价24.94\n",
      "2019-05-17, 卖出300354.SZ, 成交量-561，成交价36.58\n",
      "2019-05-17, 卖出300442.SZ, 成交量-1321，成交价14.30\n",
      "2019-05-17, 卖出300235.SZ, 成交量-522，成交价35.85\n",
      "2019-05-17, 卖出300330.SZ, 成交量-968，成交价18.85\n",
      "2019-05-17, 卖出300126.SZ, 成交量-797，成交价23.35\n",
      "2019-05-17, 买入300489.SZ, 成交量550，成交价34.06\n",
      "2019-05-17, 买入300680.SZ, 成交量971，成交价19.50\n",
      "2019-05-17, 买入300254.SZ, 成交量1518，成交价12.38\n",
      "2019-05-17, 买入300092.SZ, 成交量946，成交价19.83\n",
      "2019-05-17, 买入300211.SZ, 成交量473，成交价43.43\n",
      "2019-07-01, 卖出300211.SZ, 成交量-473，成交价43.75\n",
      "2019-07-01, 卖出300680.SZ, 成交量-52，成交价20.10\n",
      "2019-07-01, 买入300254.SZ, 成交量99，成交价11.88\n",
      "2019-07-01, 买入300092.SZ, 成交量35，成交价19.65\n",
      "2019-07-01, 买入300141.SZ, 成交量564，成交价33.95\n",
      "2019-08-12, 买入300680.SZ, 成交量17，成交价18.63\n",
      "2019-08-12, 卖出300489.SZ, 成交量-35，成交价33.86\n",
      "2019-08-12, 买入300092.SZ, 成交量54，成交价16.94\n",
      "2019-08-12, 卖出300254.SZ, 成交量-46，成交价11.10\n",
      "2019-08-12, 买入300141.SZ, 成交量41，成交价28.69\n",
      "2019-09-24, 卖出300680.SZ, 成交量-21，成交价21.19\n",
      "2019-09-24, 卖出300489.SZ, 成交量-16，成交价38.47\n",
      "2019-09-24, 买入300092.SZ, 成交量13，成交价18.45\n",
      "2019-09-24, 卖出300254.SZ, 成交量-6，成交价12.36\n",
      "2019-09-24, 卖出300141.SZ, 成交量-3，成交价31.93\n",
      "2019-11-12, 卖出300680.SZ, 成交量-1，成交价19.65\n",
      "2019-11-12, 买入300489.SZ, 成交量15，成交价35.10\n",
      "2019-11-12, 卖出300092.SZ, 成交量-12，成交价17.55\n",
      "2019-11-12, 买入300254.SZ, 成交量17，成交价11.40\n",
      "2019-11-12, 买入300141.SZ, 成交量5，成交价29.63\n",
      "2019-12-24, 卖出300680.SZ, 成交量-52，成交价21.96\n",
      "2019-12-24, 卖出300489.SZ, 成交量-21，成交价38.49\n",
      "2019-12-24, 买入300141.SZ, 成交量33，成交价29.58\n",
      "2019-12-24, 买入300254.SZ, 成交量35，成交价11.67\n",
      "2019-12-24, 买入300092.SZ, 成交量5，成交价18.14\n",
      "2020-02-13, 卖出300254.SZ, 成交量-1617，成交价13.31\n",
      "2020-02-13, 买入300680.SZ, 成交量102，成交价20.42\n",
      "2020-02-13, 买入300092.SZ, 成交量131，成交价16.81\n",
      "2020-02-13, 买入300141.SZ, 成交量13，成交价29.96\n",
      "2020-02-13, 买入300539.SZ, 成交量1322，成交价14.90\n",
      "2020-02-13, 卖出300489.SZ, 成交量-70，成交价47.08\n",
      "2020-03-26, 卖出300141.SZ, 成交量-653，成交价53.91\n",
      "2020-03-26, 卖出300539.SZ, 成交量-1322，成交价15.57\n",
      "2020-03-26, 卖出300489.SZ, 成交量-423，成交价74.22\n",
      "2020-03-26, 买入300254.SZ, 成交量2169，成交价11.67\n",
      "2020-03-26, 买入300680.SZ, 成交量27，成交价27.20\n",
      "2020-03-26, 买入300721.SZ, 成交量1149，成交价21.80\n",
      "2020-03-26, 买入300092.SZ, 成交量124，成交价19.55\n",
      "2020-03-26, 买入300022.SZ, 成交量1583，成交价16.09\n",
      "2020-05-13, 卖出300680.SZ, 成交量-991，成交价24.62\n",
      "2020-05-13, 卖出300022.SZ, 成交量-1583，成交价21.81\n",
      "2020-05-13, 卖出300092.SZ, 成交量-1296，成交价18.22\n",
      "2020-05-13, 买入300254.SZ, 成交量381，成交价9.99\n",
      "2020-05-13, 买入300330.SZ, 成交量1342，成交价19.05\n",
      "2020-05-13, 买入300153.SZ, 成交量1146，成交价22.26\n",
      "2020-05-13, 买入300721.SZ, 成交量229，成交价18.29\n",
      "2020-05-13, 买入300312.SZ, 成交量1616，成交价15.71\n",
      "2020-06-24, 卖出300330.SZ, 成交量-1342，成交价22.60\n",
      "2020-06-24, 买入300254.SZ, 成交量62，成交价10.16\n",
      "2020-06-24, 买入300312.SZ, 成交量531，成交价12.22\n",
      "2020-06-24, 买入300153.SZ, 成交量33，成交价22.44\n",
      "2020-06-24, 买入300555.SZ, 成交量1261，成交价21.02\n",
      "2020-06-24, 卖出300721.SZ, 成交量-121，成交价21.13\n",
      "2020-08-07, 卖出300721.SZ, 成交量-1257，成交价24.59\n",
      "2020-08-07, 买入300153.SZ, 成交量57，成交价24.48\n",
      "2020-08-07, 卖出300312.SZ, 成交量-154，成交价15.01\n",
      "2020-08-07, 卖出300254.SZ, 成交量-87，成交价11.68\n",
      "2020-08-07, 买入300555.SZ, 成交量33，成交价23.29\n",
      "2020-08-07, 买入300330.SZ, 成交量1156，成交价26.05\n",
      "2020-09-18, 卖出300153.SZ, 成交量-71，成交价29.50\n",
      "2020-09-18, 买入300254.SZ, 成交量127，成交价13.16\n",
      "2020-09-18, 买入300555.SZ, 成交量70，成交价25.53\n",
      "2020-09-18, 买入300330.SZ, 成交量112，成交价27.41\n",
      "2020-09-18, 卖出300312.SZ, 成交量-337，成交价20.56\n",
      "2020-11-09, 卖出300312.SZ, 成交量-1656，成交价26.53\n",
      "2020-11-09, 卖出300153.SZ, 成交量-1165，成交价46.77\n",
      "2020-11-09, 买入300330.SZ, 成交量284，成交价26.65\n",
      "2020-11-09, 买入300254.SZ, 成交量484，成交价12.94\n",
      "2020-11-09, 买入300555.SZ, 成交量16，成交价29.87\n",
      "2020-11-09, 买入300721.SZ, 成交量1341，成交价30.47\n",
      "2020-11-09, 买入300592.SZ, 成交量2106，成交价19.15\n",
      "2020-12-21, 卖出300721.SZ, 成交量-1341，成交价32.00\n",
      "2020-12-21, 卖出300592.SZ, 成交量-2106，成交价17.92\n",
      "2020-12-21, 买入300330.SZ, 成交量105，成交价22.23\n",
      "2020-12-21, 买入300254.SZ, 成交量367，成交价10.49\n",
      "2020-12-21, 买入300312.SZ, 成交量2073，成交价18.07\n",
      "2020-12-21, 买入300555.SZ, 成交量86，成交价25.15\n",
      "2020-12-21, 买入300211.SZ, 成交量844，成交价41.98\n",
      "2021-02-02, 卖出300211.SZ, 成交量-844，成交价55.79\n",
      "2021-02-02, 买入300555.SZ, 成交量220，成交价18.70\n",
      "2021-02-02, 买入300330.SZ, 成交量88，成交价17.86\n",
      "2021-02-02, 买入300153.SZ, 成交量1411，成交价22.12\n",
      "2021-02-02, 买入300254.SZ, 成交量472，成交价7.96\n",
      "2021-02-02, 买入300312.SZ, 成交量973，成交价10.37\n",
      "2021-03-23, 买入300153.SZ, 成交量138，成交价25.26\n",
      "2021-03-23, 买入300254.SZ, 成交量289，成交价8.98\n",
      "2021-03-23, 买入300330.SZ, 成交量224，成交价19.46\n",
      "2021-03-23, 买入300555.SZ, 成交量148，成交价20.92\n",
      "2021-03-23, 卖出300312.SZ, 成交量-969，成交价18.40\n",
      "2021-05-10, 卖出300312.SZ, 成交量-2077，成交价9.40\n",
      "2021-05-10, 卖出300254.SZ, 成交量-4264，成交价10.22\n",
      "2021-05-10, 卖出300153.SZ, 成交量-1549，成交价28.76\n",
      "2021-05-10, 买入300700.SZ, 成交量2492，成交价14.69\n",
      "2021-05-10, 买入300807.SZ, 成交量1565，成交价23.41\n",
      "2021-05-10, 卖出300330.SZ, 成交量-7，成交价18.77\n",
      "2021-05-10, 卖出300555.SZ, 成交量-94，成交价22.25\n",
      "2021-05-10, 买入300345.SZ, 成交量2273，成交价16.46\n",
      "2021-06-22, 卖出300345.SZ, 成交量-2273，成交价24.56\n",
      "2021-06-22, 买入300700.SZ, 成交量88，成交价17.61\n",
      "2021-06-22, 买入300534.SZ, 成交量2126，成交价21.29\n",
      "2021-06-22, 买入300807.SZ, 成交量76，成交价27.65\n",
      "2021-06-22, 买入300555.SZ, 成交量77，成交价24.93\n",
      "2021-06-22, 卖出300330.SZ, 成交量-18，成交价23.14\n",
      "2021-08-03, 卖出300330.SZ, 成交量-1944，成交价23.06\n",
      "2021-08-03, 卖出300700.SZ, 成交量-96，成交价18.62\n",
      "2021-08-03, 买入300807.SZ, 成交量114，成交价26.06\n",
      "2021-08-03, 买入300555.SZ, 成交量76，成交价24.52\n",
      "2021-08-03, 卖出300534.SZ, 成交量-190，成交价23.58\n",
      "2021-08-03, 买入300313.SZ, 成交量3675，成交价12.47\n",
      "2021-09-14, 卖出300313.SZ, 成交量-3675，成交价20.53\n",
      "2021-09-14, 买入300700.SZ, 成交量219，成交价18.66\n",
      "2021-09-14, 买入300807.SZ, 成交量281，成交价24.51\n",
      "2021-09-14, 买入300555.SZ, 成交量354，成交价22.28\n",
      "2021-09-14, 买入300534.SZ, 成交量107，成交价24.53\n",
      "2021-09-14, 买入300330.SZ, 成交量2238，成交价22.56\n",
      "2021-11-04, 卖出300700.SZ, 成交量-19，成交价16.40\n",
      "2021-11-04, 卖出300807.SZ, 成交量-77，成交价22.80\n",
      "2021-11-04, 买入300534.SZ, 成交量277，成交价19.18\n",
      "2021-11-04, 买入300330.SZ, 成交量31，成交价19.44\n",
      "2021-12-16, 买入300700.SZ, 成交量153，成交价18.31\n",
      "2021-12-16, 买入300534.SZ, 成交量50，成交价21.64\n",
      "2021-12-16, 卖出300555.SZ, 成交量-3，成交价22.98\n",
      "2021-12-16, 买入300330.SZ, 成交量238，成交价20.50\n",
      "2021-12-16, 卖出300807.SZ, 成交量-386，成交价32.41\n",
      "2022-01-28, 卖出300534.SZ, 成交量-2370，成交价36.70\n",
      "2022-01-28, 买入300807.SZ, 成交量838，成交价23.81\n",
      "2022-01-28, 买入300555.SZ, 成交量514，成交价20.87\n",
      "2022-01-28, 买入300330.SZ, 成交量421，成交价19.68\n",
      "2022-01-28, 卖出300700.SZ, 成交量-457，成交价23.03\n",
      "2022-01-28, 买入300313.SZ, 成交量4465，成交价12.81\n",
      "2022-03-18, 卖出300330.SZ, 成交量-2928，成交价26.09\n",
      "2022-03-18, 买入300555.SZ, 成交量294，成交价20.56\n",
      "2022-03-18, 买入300313.SZ, 成交量527，成交价12.71\n",
      "2022-03-18, 卖出300807.SZ, 成交量-346，成交价29.83\n",
      "2022-03-18, 买入300700.SZ, 成交量240，成交价23.73\n",
      "2022-03-18, 买入300615.SZ, 成交量2439，成交价25.74\n",
      "2022-05-06, 卖出300807.SZ, 成交量-2065，成交价19.14\n",
      "2022-05-06, 卖出300700.SZ, 成交量-2620，成交价23.07\n",
      "2022-05-06, 卖出300313.SZ, 成交量-4992，成交价10.03\n",
      "2022-05-06, 卖出300555.SZ, 成交量-3052，成交价17.66\n",
      "2022-05-06, 卖出300615.SZ, 成交量-2439，成交价22.31\n",
      "2022-05-06, 买入300321.SZ, 成交量1698，成交价30.47\n",
      "2022-05-06, 买入300594.SZ, 成交量3653，成交价14.33\n",
      "2022-05-06, 买入300736.SZ, 成交量2427，成交价22.00\n",
      "2022-05-06, 买入300521.SZ, 成交量2710，成交价19.07\n",
      "2022-05-06, 买入300637.SZ, 成交量4115，成交价12.79\n",
      "2022-06-20, 卖出300321.SZ, 成交量-20，成交价34.85\n",
      "2022-06-20, 卖出300594.SZ, 成交量-174，成交价16.72\n",
      "2022-06-20, 买入300521.SZ, 成交量178，成交价19.85\n",
      "2022-06-20, 卖出300736.SZ, 成交量-35，成交价23.97\n",
      "2022-06-20, 卖出300637.SZ, 成交量-54，成交价14.12\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2022-08-01, 买入300321.SZ, 成交量54，成交价36.73\n",
      "2022-08-01, 卖出300594.SZ, 成交量-147，成交价18.78\n",
      "2022-08-01, 买入300736.SZ, 成交量87，成交价25.38\n",
      "2022-08-01, 卖出300521.SZ, 成交量-146，成交价23.63\n",
      "2022-08-01, 卖出300637.SZ, 成交量-67，成交价15.78\n",
      "2022-09-13, 卖出300321.SZ, 成交量-41，成交价36.67\n",
      "2022-09-13, 买入300594.SZ, 成交量319，成交价16.92\n",
      "2022-09-13, 买入300521.SZ, 成交量269，成交价20.56\n",
      "2022-09-13, 卖出300736.SZ, 成交量-337，成交价28.70\n",
      "2022-09-13, 买入300637.SZ, 成交量68，成交价15.13\n",
      "2022-11-01, 买入300321.SZ, 成交量96，成交价32.47\n",
      "2022-11-01, 买入300594.SZ, 成交量21，成交价15.75\n",
      "2022-11-01, 卖出300521.SZ, 成交量-35，成交价19.45\n",
      "2022-11-01, 卖出300736.SZ, 成交量-78，成交价28.29\n",
      "2022-11-01, 买入300637.SZ, 成交量99，成交价13.90\n",
      "2022-12-13, 卖出300736.SZ, 成交量-2064，成交价37.85\n",
      "2022-12-13, 买入300321.SZ, 成交量103，成交价34.74\n",
      "2022-12-13, 买入300521.SZ, 成交量493，成交价18.90\n",
      "2022-12-13, 买入300637.SZ, 成交量452，成交价14.32\n",
      "2022-12-13, 卖出300594.SZ, 成交量-575，成交价20.85\n",
      "2022-12-13, 买入300126.SZ, 成交量2902，成交价22.52\n",
      "2023-02-01, 卖出300126.SZ, 成交量-2902，成交价24.07\n",
      "2023-02-01, 买入300321.SZ, 成交量90，成交价35.42\n",
      "2023-02-01, 买入300637.SZ, 成交量344，成交价14.02\n",
      "2023-02-01, 卖出300521.SZ, 成交量-517，成交价23.74\n",
      "2023-02-01, 买入300594.SZ, 成交量107，成交价21.84\n",
      "2023-02-01, 买入300405.SZ, 成交量3229，成交价21.64\n",
      "最终资金: 412385.29\n",
      "夏普比率: OrderedDict([('sharperatio', 0.8483978214103814)])\n",
      "回撤指标: AutoOrderedDict([('len', 0), ('drawdown', 0.0), ('moneydown', 0.0), ('max', AutoOrderedDict([('len', 219), ('drawdown', 34.53634955356987), ('moneydown', 114379.93759880005)]))])\n"
     ]
    }
   ],
   "source": [
    "cash_value={}\n",
    "result=huice_run_num(start,end,stock_list,my_strategy_date_2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "id": "4216d466",
   "metadata": {},
   "outputs": [],
   "source": [
    "cash_plot=pd.Series(cash_value)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "id": "fb2262b1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:xlabel='日期'>"
      ]
     },
     "execution_count": 109,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABBoAAAE6CAYAAAC4SDHOAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAC7ZElEQVR4nOzddXgc19XH8e+smJllWWZmiJ04sR3bAYcaZmzTpuGmSZM08KZp2rQNM9WBhhkcdMCOmZlBBjEzLsz7x0gryZJtyRbZ+n2eJ493787M3lnJ8c6Zc841TNNERERERERERKQt2Dp7AiIiIiIiIiJy7FCgQURERERERETajAINIiIiIiIiItJmFGgQERERERERkTajQIOIiIiIiIiItBkFGkRERERERESkzXh29gQOJjIy0kxOTu7saYiIiIiIiIjIflatWpVnmmbU/uNdOtCQnJzMypUrO3saIiIiIiIiIrIfwzD2Njeu0gkRERERERERaTMKNIiIiIiIiIhIm1GgQURERERERETajAINIiIiIiIiItJmFGgQERERERERkTajQIOIiIiIiIiItBkFGkRERERERESkzSjQICIiIiIiIiJtRoEGEREREREREWkzCjSIiIiIiIiIdJJv1meyNCW/s6fRphRoEBEREREREekEpmnyyDebeX3h7s6eSptSoEFERERERESkE2zKKCGzuIrpg2M6eyptSoEGERERERERkU7wy9YcDANOHhjd2VNpUwo0iIiIiIiIiHSCZbvzGRQbTGSgT2dPpU0p0CAiIiIiIiLSwexOF2v2FTG+V3hnT6XNKdAgIiIiIiIi0sE2Z5RQUeNkbHJYZ0+lzSnQICIiIiIiItIBqh1OXv51F5U1Tn7cnI3NgAm9Izp7Wm2uRYEGwzBiDMNYsN/Yi4ZhnNXg+SzDMJYYhnF/a8dEREREREREjnUfrUjlX99t5bUFKXyzIZOJfSKOuf4M0IJAg2EYYcBbQECDsROBWNM0Z9c+Pw/wME1zItDbMIx+LR1rh3MSERERERER6XK2Z5cB8PwvO9mdV855oxI7eUbtoyUZDU7gYqAEwDAML+A1YI9hGOfUbjMF+Kj28RxgUivGGjEM4/eGYaw0DGNlbm5u685GREREREREpItavrsAgBqni4GxQfxmVEInz6h9HDLQYJpmiWmaxQ2GrgI2A/8BxhuGcQtW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\n",
      "text/plain": [
       "<Figure size 1296x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "(cash_plot/25).plot(figsize=(18,5))\n",
    "index_zh_a_hist_df[\"收盘\"].plot()\n",
    "(index_zh[\"收盘\"]*1.25).plot()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "id": "42a59b37",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "日期\n",
       "2018-02-22    4052.73\n",
       "2018-02-23    4071.09\n",
       "2018-02-26    4118.42\n",
       "2018-02-27    4058.98\n",
       "2018-02-28    4023.64\n",
       "               ...   \n",
       "2023-02-06    4086.88\n",
       "2023-02-07    4094.23\n",
       "2023-02-08    4076.14\n",
       "2023-02-09    4130.86\n",
       "2023-02-10    4106.31\n",
       "Name: 收盘, Length: 1207, dtype: float64"
      ]
     },
     "execution_count": 98,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "index_zh_a_hist_df[\"收盘\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "id": "bf76e4fb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "24.674725431992755"
      ]
     },
     "execution_count": 99,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "100000/4052.73"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "id": "258569c1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0       4085.7000\n",
       "1       4111.2750\n",
       "2       4161.9625\n",
       "3       4115.0875\n",
       "4       4074.2625\n",
       "          ...    \n",
       "1202    4048.3750\n",
       "1203    4060.1125\n",
       "1204    4040.1375\n",
       "1205    4087.9750\n",
       "1206    4075.8375\n",
       "Name: 收盘, Length: 1207, dtype: float64"
      ]
     },
     "execution_count": 108,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "index_zh[\"收盘\"]*1.25"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "id": "05f52680",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              日期       开盘       收盘       最高       最低        成交量           成交额  \\\n",
      "0     2018-02-22  3237.57  3268.56  3269.92  3234.11  138730445  1.573039e+11   \n",
      "1     2018-02-23  3275.43  3289.02  3294.13  3258.49  145790369  1.595025e+11   \n",
      "2     2018-02-26  3307.29  3329.57  3335.99  3281.61  188568602  2.133330e+11   \n",
      "3     2018-02-27  3328.67  3292.07  3328.67  3284.63  174219369  2.043944e+11   \n",
      "4     2018-02-28  3264.06  3259.41  3277.83  3239.84  151043535  1.802338e+11   \n",
      "...          ...      ...      ...      ...      ...        ...           ...   \n",
      "1202  2023-02-06  3244.70  3238.70  3250.35  3226.21  267053107  3.491273e+11   \n",
      "1203  2023-02-07  3245.23  3248.09  3250.03  3233.83  250946450  3.212576e+11   \n",
      "1204  2023-02-08  3251.50  3232.11  3257.11  3230.44  234530481  2.933327e+11   \n",
      "1205  2023-02-09  3227.73  3270.38  3270.38  3225.77  254754529  3.517608e+11   \n",
      "1206  2023-02-10  3266.44  3260.67  3269.99  3247.23  260626926  3.417499e+11   \n",
      "\n",
      "        振幅   涨跌幅    涨跌额   换手率  \n",
      "0     1.12  2.17  69.40  0.32  \n",
      "1     1.09  0.63  20.46  0.34  \n",
      "2     1.65  1.23  40.55  0.44  \n",
      "3     1.32 -1.13 -37.50  0.41  \n",
      "4     1.15 -0.99 -32.66  0.35  \n",
      "...    ...   ...    ...   ...  \n",
      "1202  0.74 -0.76 -24.71  0.62  \n",
      "1203  0.50  0.29   9.39  0.58  \n",
      "1204  0.82 -0.49 -15.98  0.55  \n",
      "1205  1.38  1.18  38.27  0.59  \n",
      "1206  0.70 -0.30  -9.71  0.61  \n",
      "\n",
      "[1207 rows x 11 columns]\n"
     ]
    }
   ],
   "source": [
    "#沪深300\n",
    "index_zh = ak.index_zh_a_hist(symbol=\"000001\", period=\"daily\", start_date=\"20180222\", end_date=\"20230210\")\n",
    "print(index_zh)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "959cd18a",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.12"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
